Introduction to Python/de: Difference between revisions

From FreeCAD Documentation
No edit summary
No edit summary
 
(98 intermediate revisions by 4 users not shown)
Line 1: Line 1:
<languages/>
<languages/>
{{docnav/de
|[[Macros/de|Makros]]
|[[Python scripting tutorial/de|Python Tutorial]]}}


{{Docnav/de
{{VeryImportantMessage|(Januar 2020) FreeCAD wurde ursprünglich für die Arbeit mit Python 2 entwickelt. Da Python 2 im Jahr 2020 das Ende seiner Lebensdauer erreicht hat, wird die zukünftige Entwicklung von FreeCAD ausschließlich mit Python 3 erfolgen und die Abwärtskompatibilität wird nicht unterstützt.
|[[Scripts/de|Skripte]]
Die Informationen hier beschreiben Python 2, aber der größte Teil des Codes sollte genauso funktionieren wie mit Python 3. Insbesondere wird die Funktion {{incode|print()}} gegenüber der alten {{incode|print}} Anweisung bevorzugt.}}
|[[Python_scripting_tutorial/de|Python Skripterstellung Tutorium]]
}}


{{TOCright}}
Dies ist eine kurze Anleitung für alle, die jetzt zum ersten Mal von Python hören. [http://de.wikipedia.org/wiki/Python_%28Programmiersprache%29 Python] ist eine Open-Source-, Multiplattform-Programmiersprache. Python hat einige Merkmale, durch die es sich sehr von anderen gängigen Programmiersprachen unterscheidet, und sehr zugänglich für neue Benutzer, wie Sie selbst:


<span id="Introduction"></span>
*Es wurde speziell so erstellt, dass Menschen es einfach lesen können, und so ist es sehr einfach zu erlernen und zu verstehen.
==Einführung==
*Es wird interpretiert, das heißt, im Gegensatz zu kompilierten Sprachen wie C, muss Ihr Programm nicht kompiliert werden, bevor es ausgeführt werden kann. Der Code, den Sie schreiben, kann sofort ausgeführt werden, Zeile für Zeile, wenn Sie wollen. Das macht es äußerst leicht, zu lernen und Fehler in Ihrem Code zu finden, weil Sie langsam fortschreiten, praktisch Schritt-für-Schritt.
*Es kann in anderen Programmen eingebettet werden, um es darin als Skript-Sprache zu verwenden. FreeCAD verfügt über einen integrierten Python-Interpreter, so können Sie Python-Code in FreeCAD schreiben, der Teile von FreeCad manipulieren kann, so lassen sich zum Beispiel Geometrien erzeugen. Dies ist äußerst leistungsfähig, weil anstatt nur auf einen Knopf mit der Aufschrift "erstellen Sphäre" zu klicken, den der Programmierer dort für Sie hingezaubert hat, haben Sie die Freiheit, leicht Ihr eigenes Werkzeug zu schaffen, um genau die Geometrie zu schaffen, die Sie wollen.
*Es ist erweiterbar, Sie können ganz einfach neue Module in Ihrer Python-Installation einfügen und seine Funktionalität erweitern. Zum Beispiel haben Sie Module, die Python das Lesen und Schreiben von jpg-Bildern ermöglicht, mit Twitter zu kommunizieren, Aufgaben zu planen, die durch Ihr Betriebssystem ausgeführt werden, usw.


Dies ist ein kurzes Tutorium für diejenigen, die neu bei [https://en.wikipedia.org/wiki/Python_%28programming_language%29 Python] sind. Python ist eine quelloffene, plattformübergreifende [https://en.wikipedia.org/wiki/Programming_language Programmiersprache]. Sie verfügt über mehrere Funktionen, die sie von anderen Programmiersprachen unterscheidet, und ist für neue Benutzer sehr zugänglich:
Wir möchten Sie ermutigen, die nachfolgenden Code-Schnipsel in einen Python-Interpreter einzugeben. Wie bei vielen anderen unserer Darstellungen ist der wichtige Punkt die Zeile nach dem Ausführen des Schnipsels. Den Code nicht auszuführen wäre ein Aufbau ohne Pointe.
Also, angefasst! Seien Sie sich bewusst, dass als nächstes eine sehr einfache Einführung auf Sie zukommt, keineswegs ein komplettes Tutorial. Aber unsere Hoffnung ist, dass Sie genügend Grundlagen erhalten, um anschließend die FreeCAD-Mechanismen tiefer zu erforschen.


*Sie wurde so gestaltet, dass sie für Menschen lesbar ist, so dass sie relativ leicht zu erlernen und zu verstehen ist.
*Sie wird interpretiert, das bedeutet, dass Programme nicht erst kompiliert werden müssen, bevor sie ausgeführt werden können. Python Code kann sofort ausgeführt werden, auch Zeile für Zeile, wenn du es wünschst.
*Sie kann als Skriptsprache in andere Programme eingebettet werden. FreeCAD hat einen eingebetteten Python Interpreter. Du kannst Python Code schreiben, um Teile von FreeCAD zu verändern. Dies ist sehr mächtig, es bedeutet, daß du deine eigenen Werkzeuge bauen kannst.
*Sie ist erweiterbar, du kannst einfach neue Module in deine Python Installation einbauen und deren Funktionalität erweitern. Zum Beispiel gibt es Module, die es Python erlauben, Bilder zu lesen und zu schreiben, mit Twitter zu kommunizieren, Aufgaben zu planen, die von deinem Betriebssystem ausgeführt werden sollen, usw.

Das Folgende ist eine sehr grundlegende Einführung und keineswegs ein vollständiges Tutorium. Aber sie wird hoffentlich einen guten Ausgangspunkt für die weitere Erforschung von FreeCAD und seinen Mechanismen bieten. Wir empfehlen dir dringend, die untenstehenden Code Schnipsel in einen Python Interpreter einzugeben.

<span id="The_interpreter"></span>
==Der Interpreter==
==Der Interpreter==


In der Regel öffnen Sie beim Schreiben von Computerprogrammen einfach einen Texteditor oder Ihre bevorzugte Programmierumgebung (was in den meisten Fällen ein Texteditor mit mehreren Werkzeugen darin ist), Sie schreiben Ihr Programm, dann kompilieren Sie und führen es aus. Meistens werden Sie Fehler beim Schreiben des Programms machen, so dass Ihr Programm nicht funktioniert, und Sie erhalten eine Fehlermeldung, was schief gelaufen ist. Dann kehren Sie zu Ihrem Text-Editor zurück, korrigieren die Fehler, starten erneut und so weiter, bis Ihr Programm fehlerfrei arbeitet.
Gewöhnlich öffnest du beim Schreiben von Computerprogrammen einen Texteditor oder deine spezielle Programmierumgebung (die im Grunde ein Texteditor mit einigen zusätzlichen Werkzeugen ist), schreibst dein Programm, kompilierst und führst es dann aus. Oftmals wurden bei der Eingabe ein oder mehrere Fehler gemacht, so dass dein Programm nicht funktioniert. Möglicherweise erhälst du sogar eine Fehlermeldung, die dir mitteilt, was schief gelaufen ist. Dann gehe zurück zu deinem Texteditor, korrigiere die Fehler, laufe erneut durch und wiederhole dies, bis dein Programm wie beabsichtigt funktioniert.


In Python kann dieser ganze Prozess transparent im Python-Interpreter ausgeführt werden. Der Interpreter ist ein Python-Fenster mit einer Eingabeaufforderung, wo Sie einfach Python-Code eintippen können. Wenn Sie Python auf Ihrem Computer installieren (Download von der [http://www.python.org Python-Website] herunterladen, wenn Sie es auf Windows-oder Mac benutzen, installieren Sie es von Ihrem Paket-Repository, wenn Sie auf GNU / Linux installieren), werden Sie einen Python-Interpreter in Ihrem Startmenü haben.
In Python kann dieser ganze Prozess transparent im Python Interpreter ausgeführt werden. Der Interpreter ist ein Python Fenster mit einer Eingabeaufforderung, wo du einfach Python Code eintippen kannst. Wenn du Python auf deinem Computer installiert hast (Herunterladen von der [https://www.python.org/ Python Webseite], wenn du es auf Windows- oder Mac benutzt, installiere es von deinem Paket Repositorium, wenn du auf GNU/ Linux installierst). Aber, wie bereits erwähnt, hat FreeCAD auch einen eingebauten Python Interpreter: die [[Python_console/de|Python Konsole]].
Aber FreeCAD bietet auch einen Python-Interpreter in seinem unteren Teil:


[[Image:Screenshot_pythoninterpreter.jpg]]
[[Image:FreeCAD_Python_console.png]]
{{Caption|Die FreeCAD Python Konsole}}


(Falls bei Ihnen nicht angezeigt, klicken Sie auf: Ansicht → Ansichten → Python-Konsole.)
Wenn du sie nicht siehst, klicke auf {{MenuCommand|Ansicht → Paneele → Python Konsole}}. Die Python Konsole kann in der Größe verändert und auch wieder abgedockt werden.

Der Interpreter zeigt die Python Version, dann ein {{incode|>>>}} Symbol, das ist die Eingabeaufforderung, das heißt, hier geben Sie Python-Code ein. Schreiben von Code im Interpreter ist einfach: eine Zeile ist eine Anweisung. Wenn du {{KEY|Enter}} drückst, wird dein Code Zeile ausgeführt (nachdem sie sofort und unsichtbar kompiliert wurde). Zum Beispiel, versuche dies zu schreiben:


Der Interpreter zeigt die Python-Version, dann ein >>> Symbol, das ist die Eingabeaufforderung, das heißt, hier geben Sie Python-Code ein. Schreiben von Code im Interpreter ist einfach: eine Zeile ist ein Befehl. Wenn Sie die Eingabetaste drücken, wird Ihre Code-Zeile ausgeführt (nachdem sie sofort und unsichtbar kompiliert wurde). Zum Beispiel, versuchen Sie dies zu schreiben:
{{Code|code=
{{Code|code=
print "hello"
print("hello")
}}
}}

<code> print </code> ist ein spezielles Python-Schlüsselwort, das bedeutet natürlich, etwas auf dem Bildschirm auszugeben. Wenn Sie die Eingabetaste drücken, wird die Operation ausgeführt, und die Nachricht "Hallo" wird gedruckt. Wenn Sie einen Fehler machen, schreiben wir zum Beispiel:
{{incode|print()}} ist ein Python Befehl, der natürlich, etwas auf den Bildschirm druckt. Wenn du die {{KEY|Eingabetaste}} drückst, wird die Operation ausgeführt, und die Nachricht {{incode|"Hallo"}} wird gedruckt. Wenn du einen Fehler machst, schreiben wir zum Beispiel:

{{Code|code=
{{Code|code=
print hello
print(hello)
}}
}}
Python meldet nun, dass es nicht weiß, was Hallo ist. Die " Zeichen geben an, dass der Inhalt ein String ist, einfacher gesagt, im Programmier-Jargon, ein Stück Text. Ohne die " glaubt der Druckbefehl Hallo sei nicht einfach Text, sondern ein spezielles Python-Schlüsselwort. Das Wichtigste ist, Sie werden sofort benachrichtigt, dass Sie einen Fehler gemacht haben. Durch Drücken des Pfeil nach oben (oder im FreeCAD-Interpreter, STRG + Pfeil nach oben), können Sie zurück zum letzten Befehl, den Sie geschrieben haben und diesen korrigieren.


Python wird dir dies sofort mitteilen. In diesem Fall weiß Python nicht, was {{incode|hallo}} ist. Die {{incode|" "}} Zeichen geben an, dass der Inhalt eine Zeichenfolge ist, d.h. Programmierjargon für ein Stück Text. Ohne diese Zeichen erkennt der {{incode|print()}} Befehl nicht {{incode|hello}}. Durch Drücken des Pfeils nach oben kannst du zur letzten Codezeile zurückgehen und diese korrigieren.
Der Python-Interpreter hat auch ein eingebautes Hilfesystem. Schreiben Sie mal:

{{Code|code=
Der Python Interpreter hat auch ein eingebautes Hilfesystem. Nehmen wir an, wir verstehen nicht, was mit {{incode|print(hello)}} schief gelaufen ist, und wir wollen konkrete Informationen über den Befehl:
help

}}
oder beispielsweise, sagen wir, wir verstehen nicht, was oben mit unserem Print-hallo-Befehl schief ging, wir wollen also spezifische Informationen über den Befehl "print" :
{{Code|code=
{{Code|code=
help("print")
help("print")
}}
}}
Jetzt erhalten Sie eine lange und vollständige Beschreibung dessen, was der Befehl print alles tun kann.


Du erhältst eine lange und vollständige Beschreibung von allem, was der {{incode|print()}} Befehl tun kann.
Und da wir jetzt völlig unseren Interpreter beherrschen, können wir mit dem ernsten Zeug beginnen.


Jetzt, da du den Python Interpreter verstehst, können wir mit den ernsteren Dingen fortfahren.
{{Top}}
<span id="Variables"></span>
==Variablen==
==Variablen==


Sehr oft musst du beim Programmieren einen Wert unter einem Namen speichern. An dieser Stelle kommen Variablen ins Spiel. Gib zum Beispiel dies ein:
Natürlich ist die Ausgabe von "Hallo" nicht sehr interessant. Interessanter ist die Ausgabe von Dingen, die Sie vorher nicht wissen, oder die Python für Sie herausfindet. Das ist, wo das Konzept der Variablen ins Spiel kommt. Eine Variable ist einfach ein Wert, den Sie unter einem Namen speichern. Tippen Sie zum Beispiel das:

{{Code|code=
{{Code|code=
a = "hello"
a = "hello"
print a
print(a)
}}
}}

Ich vermute, Sie verstehen, was passiert ist, wir speichern die Zeichenfolge "Hallo" unter dem Namen "a". Jetzt ist "a" kein unbekannter Name mehr! Wir können es überall einsetzen, z. B. in den print-Befehl. Wir können jeden beliebigen Namen verwenden, den wir wollen, es gibt nur einige einfache Regeln zu respektieren, wie keine mit Leerzeichen oder Satzzeichen zu verwenden. Zum Beispiel könnten wir sehr wohl schreiben:
Du verstehst wahrscheinlich, was hier passiert ist, wir haben die Zeichenfolge {{incode|"hello"}} unter dem Namen {{incode|a}} gespeichert. Jetzt, da {{incode|a}} bekannt ist, können wir sie überall verwenden, zum Beispiel im {{incode|print()}} Befehl. Wir können jeden beliebigen Namen verwenden, wir müssen nur einige einfache Regeln befolgen, wie z.B. keine Leerzeichen oder Interpunktion und keine Python Schlüsselwörter verwenden. Wir können zum Beispiel schreiben:

{{Code|code=
{{Code|code=
hello = "my own version of hello"
hello = "my own version of hello"
print hello
print(hello)
}}
}}

Gesehen? Jetzt ist Hallo kein undefiniertes Wort mehr. Was ist, wenn wir unglücklicherweise einen Namen wählen, der bereits in Python existiert? Sagen wir, wir wollen unseren String unter dem Namen "print" zu speichern:
Nun ist {{incode|hallo}} nicht mehr undefiniert. Variablen können jederzeit geändert werden, deshalb nennt man sie Variablen, ihr Inhalt kann variieren. Zum Beispiel:
{{Code|code=

print = "hello"
}}
Python ist sehr intelligent und wird uns sagen, dass dies nicht möglich ist. Es gibt einige "reservierte" Schlüsselwörter, die nicht modifiziert werden können. Aber unsere eigenen Variablen können jederzeit geändert werden, das ist genau, warum sie Variablen genannt werden, weil sich die Inhalt ändern können. Zum Beispiel:
{{Code|code=
{{Code|code=
myVariable = "hello"
myVariable = "hello"
print myVariable
print(myVariable)
myVariable = "good bye"
myVariable = "good bye"
print myVariable
print(myVariable)
}}
}}

Wir änderten den Wert von myVariable. Wir können auch Variablen kopieren:
Wir haben den Wert von {{incode|myVariable}} geändert. Wir können auch Variablen kopieren:

{{Code|code=
{{Code|code=
var1 = "hello"
var1 = "hello"
var2 = var1
var2 = var1
print var2
print(var2)
}}
}}
Beachten Sie, dass es wichtig ist, Variablen sinnvolle Namen zu geben, da, wenn Sie lange Programme schreiben, Sie sich nach einer Weile nicht daran erinnern werden, wofür Ihre Variable mit dem Namen "a" steht. Aber wenn Sie es, zum Beispiel, myWelcomeMessage nannten, werden Sie sich leicht erinnern, wofür sie verwendet wird, wenn Sie es sehen werden. Außerdem ist Ihr Code einen Schritt näher an der Selbstdokumentation.


Es ist ratsam, deinen Variablen aussagekräftige Namen zu geben. Nach einer Weile wirst du dich nicht mehr daran erinnern, was deine Variable mit dem Namen {{incode|a}} darstellt. Aber wenn du sie zum Beispiel {{incode|myWelcomeMessage}} genannt hast, wirst du dich leicht an ihren Zweck erinnern. Außerdem ist dein Code einen Schritt näher an der Selbst-erklärend.
Groß-/Kleinschreibung ist sehr wichtig. myVariable ist nicht das Gleiche wie myvariable, der Unterschied ist das große/kleine "v". Wenn Sie schreiben "print myvariable" wird als Fehler "nicht definiert" angezeigt.


Der Fall ist sehr wichtig, {{incode|myVariable}} ist nicht dasselbe wie {{incode|myvariable}}. Wenn du {{incode|print(myvariable)}} eingeben würdest, würde es mit einem Fehler als nicht definiert zurückgegeben werden.
{{Top}}
<span id="Numbers"></span>
==Zahlen==
==Zahlen==


Natürlich müssen Sie wissen, dass die Programmierung nützlich ist, jede Art von Daten zu behandeln, besonders Zahlen, nicht nur Text-Strings. Eines ist wichtig, Python muss wissen, mit welchen Daten es sich befasst. Wir sahen in unserem print hallo Beispiel, dass der Druckbefehl unseren "hallo" String erkannte. Durch die " sagten wir dem Druckbefehl, was als Nächstes kommen würde, ist ein Text-String.
Natürlich können Python Programme mit allen Arten von Daten umgehen, nicht nur mit Textzeichenfolgen. Eine Sache ist wichtig, Python muss wissen, mit welcher Art von Daten es zu tun hat. Wir haben in unserem Hallo Druck Beispiel gesehen, dass der Befehl {{incode|print()}} unsere {{incode|"hallo"}} Zeichenfolge erkannt hat. Durch die Verwendung von {{incode|" "}} Zeichen haben wir festgelegt, dass das, was folgt, eine Textzeichenfolge ist.

Wir können immer den Datentyp einer Variablen überprüfen, mit dem {{incode|type()}} Befehl:


Wir können immer den Datentyp einer Variablen überprüfen, mit dem speziellen Python-Schlüsselwort: type
{{Code|code=
{{Code|code=
myVar = "hello"
myVar = "hello"
type(myVar)
type(myVar)
}}
}}

Es wird uns sagen, der Inhalt von myVar ist 'str', die Kurzform für String in Python-Jargon. Wir haben auch andere Arten von Daten, wie Integer und Fließkomma-Zahlen:
Es wird uns sagen, der Inhalt von {{incode|myVar}} ist ein {{incode|'str'}}, was die Kurzform für Zeichenfolge ist. Wir haben auch andere grundlegende Datentypen wie Integer und Gleitkomma Zahlen:

{{Code|code=
{{Code|code=
firstNumber = 10
firstNumber = 10
secondNumber = 20
secondNumber = 20
print firstNumber + secondNumber
print(firstNumber + secondNumber)
type(firstNumber)
type(firstNumber)
}}
}}

Dies ist bereits viel interessanter, nicht wahr? Jetzt haben wir bereits einen leistungsfähigen Rechner! Schauen Sie genau hin, wie es funktioniert, Python weiß, die 10 und 20 sind ganze Zahlen. So werden sie als "int" gespeichert, und Python kann mit ihnen alles tun, was es mit ganzen Zahlen machen kann. Schauen Sie sich dieses Ergebnis an:
Python weiß, dass 10 und 20 ganze Zahlen sind, also werden sie als {{incode|'int'}} gespeichert, und Python kann mit ihnen alles machen, was es mit ganzen Zahlen machen kann. Schaue dir die Ergebnisse davon an:

{{Code|code=
{{Code|code=
firstNumber = "10"
firstNumber = "10"
secondNumber = "20"
secondNumber = "20"
print firstNumber + secondNumber
print(firstNumber + secondNumber)
}}
}}

Gesehen? Wir zwangen Python zu denken, dass unsere zwei Variablen nicht Zahlen, sondern bloße Stücke Text sind. Python kann zwei Stücke Text zusammenfügen, aber es wird nicht versuchen, daraus ein Summe zu bilden. Aber wir sprachen über Ganz-Zahlen. Es gibt auch Fließkomma-Zahlen. Der Unterschied ist, dass Ganz-Zahlen keine Nachkommastellen haben, während Fließkomma-Zahlen auch Dezimalstellen haben können:
Hier haben wir Python gezwungen, zu bedenken, dass unsere beiden Variablen keine Zahlen, sondern Textstücke sind. Python kann zwei Textstücke zusammenfügen, obwohl es in diesem Fall natürlich keine Arithmetik ausführt. Aber wir sprachen über ganze Zahlen. Es gibt auch Gleitkommazahlen. Der Unterschied ist, dass Gleitkommazahlen einen Dezimalteil haben können und Ganzzahlen nicht:

{{Code|code=
{{Code|code=
var1 = 13
var1 = 13
var2 = 15.65
var2 = 15.65
print "var1 is of type ", type(var1)
print("var1 is of type ", type(var1))
print "var2 is of type ", type(var2)
print("var2 is of type ", type(var2))
}}
}}

Ganz- und Fließkomma-Zahlen können problemlos gemischt werden:
Ganzzahlen und Gleitkommazahlen können problemlos miteinander gemischt werden:

{{Code|code=
{{Code|code=
total = var1 + var2
total = var1 + var2
print total
print(total)
print type(total)
print(type(total))
}}
}}

Natürlich hat die Summe Dezimalstellen, richtig? Dann hat Python automatisch entschieden, dass das Ergebnis ein float(Fließkomma-Zahl) ist. In einigen Fällen wie diesem, entscheidet Python automatisch, welcher Typ anzuwenden ist. In anderen Fällen tut es das nicht. Zum Beispiel:
Da {{incode|var2}} ein Gleitkommawert ist, entscheidet Python automatisch, dass das Ergebnis ebenfalls ein Gleitkommawert sein muss. Aber es gibt Fälle, in denen Python nicht weiß, welchen Typ es verwenden soll. Zum Beispiel:

{{Code|code=
{{Code|code=
varA = "hello 123"
varA = "hello 123"
varB = 456
varB = 456
print varA + varB
print(varA + varB)
}}
}}

Dies gibt uns einen Fehler, weil varA einen String und varB ein int ist, und Python nicht weiß, was zu tun ist. Aber wir können Python zwingen, zwischen Typen zu konvertieren:
Dies führt zu einem Fehler, {{incode|varA}} ist eine Zeichenfolge und {{incode|varB}} ist eine ganze Zahl, und Python weiß nicht, was zu tun ist. Wir können Python jedoch zwingen, zwischen den Typen zu konvertieren:

{{Code|code=
{{Code|code=
varA = "hello"
varA = "hello"
varB = 123
varB = 123
print varA + str(varB)
print(varA + str(varB))
}}
}}

Nun sind beides Strings und der Ablauf funktioniert! Bemerken Sie, dass wir varB zur Zeit des Druckes "stringified" haben, aber wir varB selbst nicht änderten. Wenn wir varB dauerhaft in einen String ändern wollten, würden wir folgendes tun müssen:
Nun, da beide Variablen Zeichenfolgen sind, funktioniert die Operation. Beachte, dass wir {{incode|varB}} zum Zeitpunkt des Drucks "zeichenfolgenfiziert" haben, aber {{incode|varB}} selbst nicht geändert haben. Wenn wir {{incode|varB}} dauerhaft in eine Zeichenfolge verwandeln wollten, müssten wir dies tun:

{{Code|code=
{{Code|code=
varB = str(varB)
varB = str(varB)
}}
}}

Wir können auch int() und float() einsetzen, um Werte zu konvertieren in int und float, wenn wir wollen:
Wir können auch {{incode|int()}} und {{incode|float()}} einsetzen, um Werte zu konvertieren in Ganzzahlen und Gleitkommazahlen, wenn wir wollen:

{{Code|code=
{{Code|code=
varA = "123"
varA = "123"
print int(varA)
print(int(varA))
print float(varA)
print(float(varA))
}}
}}
'''Hinweis zu Python-Kommandos'''


Sie werden bemerkt haben, dass wir in diesem Abschnitt den Befehl 'print' in mehrfacher Weise verwendet haben. Wir druckten Variablen, Summen, mehrere Dinge durch Kommas getrennt, und auch das Ergebnis anderer Python-Befehle wie type(). Vielleicht haben Sie auch gesehen, dass die Anwendung dieser beiden Befehle,
Du hast sicher bemerkt, dass wir den Befehl {{incode|print()}} auf verschiedene Weise verwendet haben. Wir haben Variablen, Summen, verschiedene durch Kommas getrennte Dinge und sogar das Ergebnis eines anderen Pythonbefehls gedruckt. Vielleicht hast du auch gesehen, dass diese beiden Befehle:

{{Code|code=
{{Code|code=
type(varA)
type(varA)
print type(varA)
print(type(varA))
}}
}}

absolut das selbe Resultat ergeben. Das passiert, weil wir im Interpreter sind, und alles automatisch auf dem Bildschirm ausgegeben wird. Wenn wir kompliziertere Programme schreiben werden, die außerhalb des Interpreters laufen sollen, wird nicht automatisch alles auf dem Schirm ausgegeben, also werden wir den Druckbefehl verwenden müssen. Aber im Moment wollen wir aufhören, es hier zu verwenden, weil es schneller geht. So können wir einfach schreiben:
das gleiche Ergebnis haben. Das liegt daran, dass wir uns im Interpreter befinden, und alles wird automatisch ausgedruckt. Wenn wir komplexere Programme schreiben, die außerhalb des Interpreters laufen, werden sie nicht automatisch gedruckt, so dass wir den Befehl {{incode|print()}} verwenden müssen. Mit diesem Gedanken im Hinterkopf sollten wir ihn hier nicht mehr verwenden. Von nun an werden wir einfach schreiben:

{{Code|code=
{{Code|code=
myVar = "hello friends"
myVar = "hello friends"
myVar
myVar
}}
}}
{{Top}}
Sie werden auch gesehen haben, dass die meisten Python-Befehle (oder Schlüsselwörter), die wir bereits kennen, den Inhalt, den der Befehl bearbeiten muss, durch Klammern eingrenzen: type(), int(), str(), etc. Die einzige Ausnahme ist der print-Befehl, der tatsächlich keine Ausnahme ist, er funktioniert auch ganz normal so: print("hello"), aber, da er oft verwendet wird, haben die Python-Programmierer eine vereinfachte Version geschaffen.
<span id="Lists"></span>

==Listen==
==Listen==


Ein weiterer interessanter Datentyp sind Listen. Eine Liste ist schlicht eine Liste zusammengestellter Daten. Genau wie wir einen Text-String durch das Benutzen von " " definieren, definieren wir Listen durch [ ]:
Ein weiterer nützlicher Datentyp ist eine Liste. Eine Liste ist eine Sammlung von anderen Daten. Um eine Liste zu definieren, verwenden wir {{incode|[ ]}}:

{{Code|code=
{{Code|code=
myList = [1,2,3]
myList = [1, 2, 3]
type(myList)
type(myList)
myOtherList = ["Bart", "Frank", "Bob"]
myOtherList = ["Bart", "Frank", "Bob"]
myMixedList = ["hello", 345, 34.567]
myMixedList = ["hello", 345, 34.567]
}}
}}

Sie sehen, es können beliebige Arten von Daten darin enthalten sein. Listen sind sehr hilfreich, weil Sie Variable gruppieren können. Man kann dann alle möglichen Dinge innerhalb der Gruppe, wie z.B. diese zählen:
Wie du siehst, kann eine Liste jede Art von Daten enthalten. Mit einer Liste kannst du viele Dinge tun. Zum Beispiel kannst du deine Elemente zählen:

{{Code|code=
{{Code|code=
len(myOtherList)
len(myOtherList)
}}
}}

oder ein einzelnes Element aus der Liste abrufen:
Oder ein Element abrufen:

{{Code|code=
{{Code|code=
myName = myOtherList[0]
myName = myOtherList[0]
myFriendsName = myOtherList[1]
myFriendsName = myOtherList[1]
}}
}}
Wie Sie sehen, wird durch den Befehl len() die gesamte Anzahl von Elementen in einer Liste ausgegeben, deren "Position" in der Liste mit 0 beginnt. Das erste Element einer Liste ist immer an Position 0, somit ist in unserer myOtherList, "Bob" an Position 2 zu finden. Darüber hinaus lässt sich noch jede Menge mehr mit Listen anstellen, wie man z.B. [http://www.wspiegel.de/pykurs/python11.htm hier] nachlesen kann, beispielsweise Inhalte sortieren, oder Elemente hinzufügen oder entfernen.


Während der {{incode|len()}} Befehl die Gesamtzahl der Elemente in einer Liste zurückgibt, steht das erste Element in einer Liste immer an der Position {{incode|len|0}}, so dass in unserer {{incode|myOtherList}} {{incode|"Bob"}} wird an der Position {{incode|2}} stehen. Mit Listen können wir viel mehr tun, z.B. Artikel sortieren und Artikel entfernen oder hinzufügen.
Ein lustiger und interessanter Hinweis für Sie: Ein Text-String hat sehr viel gemeinsam mit einer Liste von Buchstaben! Versuchen Sie das mal:

Interessanterweise ist eine Textzeichenfolge einer Liste von Zeichen in Python sehr ähnlich. Versuche dies zu tun:

{{Code|code=
{{Code|code=
myvar = "hello"
myvar = "hello"
Line 180: Line 218:
myvar[2]
myvar[2]
}}
}}
Üblicherweise kann man alles, was man mit Listen tun kann, auch auf Strings anwenden. Denn tatsächlich sind Listen und Strings eigentlich Sequenzen.


Normalerweise kann das, was du mit Listen machen kannst, auch mit Zeichenketten gemacht werden. Tatsächlich sind sowohl Listen als auch Zeichenketten Sequenzen.
Außer Strings, Ints, Floats und Listen, gibt es noch weitere eingebaute Datentypen, wie z.B. [http://www.python-kurs.eu/dictionaries.php Wörterbücher], oder Sie können auch Ihre eigenen Datentypen erstellen durch verwenden von [http://de.wikibooks.org/wiki/Python-Programmierung:_Klassen_und_Methoden Klassen].


Neben Zeichenketten, Ganzzahlen, Gleitkommazahlen und Listen gibt es weitere eingebaute Datentypen, wie z.B. Wörterbücher, und du kannst sogar eigene Datentypen mit Klassen erstellen.
{{Top}}
<span id="Indentation"></span>
==Einrückung==
==Einrückung==


Cool ist beim Gebrauch von Listen auch, dass man sie durchsuchen und mit jedem Fund etwas tun kann. Schauen Sie zum Beispiel hier:
Ein wichtiger Nutzen von Listen ist die Möglichkeit, sie "durchzublättern" und mit jedem Punkt etwas zu tun. Sieh dir zum Beispiel das hier an:

{{Code|code=
{{Code|code=
alldaltons = ["Joe", "William", "Jack", "Averell"]
alldaltons = ["Joe", "William", "Jack", "Averell"]
for dalton in alldaltons:
for dalton in alldaltons:
print dalton + " Dalton"
print(dalton + " Dalton")
}}
}}
Wir iterierten (schon wieder Programmier-Jargon!) durch unsere Liste mittels des "for ... in ..." -Befehls und haben mit jedem der gefundenen Elemente etwas gemacht. Beachten Sie die spezielle Syntax: der '''for'''-Befehl endet mit ''':''' Dies deutet an, dass alles was danach kommt, ein Befehlsblock mit einem oder mehreren Befehlen sein wird. Unmittelbar nachdem die Befehlszeile mit : endet, wird die Eingabeaufforderung sich so verändern ... was bedeutet, Python weiß, dass eine :-beendete Eingabe aufgetreten ist und dass das, was als nächstes kommen wird, Teil davon ist.


Wir iterierten (Programmierjargon) durch unsere Liste mit dem Befehl {{incode|for in}} und machten etwas mit jedem der Punkte. Beachte die spezielle Syntax: Der Befehl {{incode|for}} endet mit {{incode|:}} und zeigt an, dass es sich bei dem folgenden Befehl um einen Block mit einem oder mehreren Befehlen handelt. Im Interpreter wechselt die Eingabeaufforderung unmittelbar nach der Eingabe der Befehlszeile, die mit {{incode|:}} endet, zu {{incode|...}}, was bedeutet, dass Python weiß, dass noch mehr kommen wird.
Wie wird Python wissen, wie viele der folgenden Zeilen innerhalb der for...in Operation durchgeführt werden sollen? Dafür verwendet Python die Einrückung.
Das heißt, dass Ihre nächsten Zeilen nicht sofort beginnen. Sie werden sie durch ein Leerzeichen oder mehrere Leerzeichen oder einen Tab oder mehrere Tab´s beginnen. Andere Programmiersprachen verwenden andere Methoden, wie z.B. alles in Klammern zu setzen, etc. Solange Sie Ihre folgenden Zeilen mit derselben Einrückung schreiben, werden sie als ein Teil des for...in Blocks betrachtet.
Wenn Sie eine Zeile mit zwei Leerzeichen und die nächste mit vier beginnen, gibt es einen Fehler. Wenn Sie fertig sind, schreiben Sie einfach eine Zeile ohne Einrückung, oder drücken Sie einfach ENTER, um den for...in Block zu verlassen.


Woher wird Python wissen, wie viele der nächsten Zeilen innerhalb der Operation {{incode|for in}} ausgeführt werden müssen? Python verlässt sich dabei auf Einrückung. Die nächsten Zeilen müssen mit einem Leerzeichen, oder mehreren Leerzeichen, oder einem Tabulator, oder mehreren Tabulatoren beginnen. Und solange die Einrückung gleich bleibt, werden die Zeilen als Teil des {{incode|for in}} Blocks betrachtet. Wenn du eine Zeile mit 2 Leerzeichen und die nächste mit 4 beginnst, gibt es einen Fehler. Wenn du fertig bist, schreibe einfach eine weitere Zeile ohne Einrückung, oder drücke {{KEY|Enter}}, um vom {{incode|for in}} Block zurückzukehren
Einrückung ist cool, denn sie erhöht die Lesbarkeit. Falls Sie große Einrückungen nutzen (z.B. Tabulatoren statt Leerzeichen, weil größer), wenn Sie ein großes Programm schreiben, werden Sie eine klare Übersicht haben, was im Inneren von Blöcken ausgeführt wird.

Wir werden sehen, dass Befehle außer for...in ebenfalls eingerückten Code nutzen.
Die Einrückung trägt auch zur Lesbarkeit des Programms bei. Wenn du beim Schreiben eines großen Programms große Einrückungen verwendest (z.B. Tabulatoren anstelle von Leerzeichen verwendest), hast du einen klaren Überblick darüber, was innerhalb von was ausgeführt wird. Wir werden sehen, dass auch andere Befehle eingerückte Codeblöcke verwenden.

Der {{incode|for in}} Befehl kann für viele Dinge verwendet werden, die mehr als einmal ausgeführt werden müssen. Er kann z.B. mit dem Befehl {{incode|range()}} kombiniert werden:


For-in-Befehle können für viele Dinge, die mehr als einmal getan werden müssen, verwendet werden. Er kann, zum Beispiel, mit dem range()-Befehl verbunden werden:
{{Code|code=
{{Code|code=
serie = range(1,11)
serie = range(1, 11)
total = 0
total = 0
print "sum"
print("sum")
for number in serie:
for number in serie:
print number
print(number)
total = total + number
total = total + number
print "----"
print("----")
print total
print(total)
}}
}}
(Wenn Sie die Code-Beispiele durch Copy-und-Paste in einem Interpreter ausgeführt haben, werden Sie feststellen, dass der vorige Text-Block einen Fehler produziert. Kopieren Sie statt dessen bis zum Ende des eingerückten Blocks, das heißt zum Ende der Zeile "total = total + number" und fügen das in den Interpreter ein. Drücken Sie im Interpreter die Eingabetaste, bis die drei Punkte verschwinden und der Code läuft. Kopieren Sie dann die beiden letzten Zeilen in dem Interpreter und drücken ein oder mehrmals die Eingabetaste. Die abschließende Ausgabe sollte erscheinen).


Wenn du die Code Beispiele in einem Interpreter durch Kopieren und Einfügen ausgeführt hast, wirst du feststellen, dass der vorherige Textblock einen Fehler auslöst. Kopiere stattdessen an das Ende des eingerückten Blocks, d.h. an das Ende der Zeile {{incode|total <nowiki>=</nowiki> total + number}} und füge dann im Interpreter ein. Drücke im Interpreter {{KEY|Enter}}, bis die Eingabeaufforderung mit den drei Punkten verschwindet und der Code ausgeführt wird. Kopiere dann die letzten beiden Zeilen, gefolgt von einer weiteren {{KEY|Enter}}. Die endgültige Antwort sollte erscheinen.
Wenn Sie in den Interpreter '''help(range)''' eintippen, würden Sie sehen:

Wenn du in den Interpreter {{incode|help(range)}} eintippst, wirst du sehen:

{{Code|code=
{{Code|code=
range(...)
range(...)
Line 220: Line 262:
range(start, stop[, step]) -> list of integers
range(start, stop[, step]) -> list of integers
}}
}}

Hier geben die eckigen Klammern einen optionalen Parameter an. Trotzdem werden jeweils Ganz-Zahlen erwartet. Wir werden mit der Hilfe von int() dafür sorgen, dass die range-Parameter Ganz-Zahlen sind
Hier bezeichnen die eckigen Klammern einen optionalen Parameter. Es wird jedoch erwartet, dass es sich bei allen Parametern um ganze Zahlen handelt. Im Folgenden erzwingen wir mit {{incode|int()}}, dass der Schrittparameter eine ganze Zahl ist:

{{Code|code=
{{Code|code=
number = 1000
decimales = 1000 # for 3 decimales
for i in range(0, 180 * number, int(0.5 * number)):
#decimales = 10000 # for 4 decimales ...
print(float(i) / number)
for i in range(int(0 * decimales),int(180 * decimales),int(0.5 * decimales)):
print float(i) / decimales
}}
}}

Oder komplexere Dinge wie diese:
Ein weiteres {{incode|range()}} Beispiel:

{{Code|code=
{{Code|code=
alldaltons = ["Joe", "William", "Jack", "Averell"]
alldaltons = ["Joe", "William", "Jack", "Averell"]
for n in range(4):
for n in range(4):
print alldaltons[n], " is Dalton number ", n
print(alldaltons[n], " is Dalton number ", n)
}}
}}

Sie sehen, dass der range()-Befehl auch eine seltsame Eigenart hat, dass er bei 0 beginnt (wenn Sie die Startzahl nicht vorgeben) und dass seine letzte Zahl eins weniger sein wird als die Endzahl, die Sie angeben. Das heisst natürlich, so arbeitet es gut mit anderen Python-Befehlen zusammen. Zum Beispiel:
Der {{incode|range()}} Befehl hat auch die seltsame Besonderheit, dass er mit {{incode|0}} beginnt (wenn du die Startnummer nicht angibst) und dass seine letzte Nummer um eins kleiner ist als die von dir angegebene Endnummer. Das ist natürlich, damit es gut mit anderen Python Befehlen funktioniert. Zum Beispiel:

{{Code|code=
{{Code|code=
alldaltons = ["Joe", "William", "Jack", "Averell"]
alldaltons = ["Joe", "William", "Jack", "Averell"]
total = len(alldaltons)
total = len(alldaltons)
for n in range(total):
for n in range(total):
print alldaltons[n]
print(alldaltons[n])
}}
}}

Eine weitere interessante Anwendung von eingerückten Blöcken ist der if-Befehl. If führt einen Code-Block nur aus, wenn eine bestimmte Bedingung erfüllt ist, zum Beispiel:
Eine weitere interessante Verwendung von eingerückten Blöcken ist der Befehl {{incode|if}}. Dieser Befehl führt einen Codeblock nur dann aus, wenn z.B. eine bestimmte Bedingung erfüllt ist:

{{Code|code=
{{Code|code=
alldaltons = ["Joe", "William", "Jack", "Averell"]
alldaltons = ["Joe", "William", "Jack", "Averell"]
if "Joe" in alldaltons:
if "Joe" in alldaltons:
print "We found that Dalton!!!"
print("We found that Dalton!!!")
}}
}}

Natürlich wird das immer den ersten Satz ausgeben, aber versuchen Sie, die zweite Zeile wie folgt zu ersetzen:
Natürlich wird dabei immer der Satz gedruckt, aber versuche, die zweite Zeile zu ersetzen mit:

{{Code|code=
{{Code|code=
if "Lucky" in alldaltons:
if "Lucky" in alldaltons:
}}
}}

Dann wird nichts ausgegeben. Wir können auch eine else: Anweisung nutzen:
Dann wird nichts ausgegeben. Wir können auch eine {{incode|else}} Anweisung angeben:

{{Code|code=
{{Code|code=
alldaltons = ["Joe", "William", "Jack", "Averell"]
alldaltons = ["Joe", "William", "Jack", "Averell"]
if "Lucky" in alldaltons:
if "Lucky" in alldaltons:
print "We found that Dalton!!!"
print("We found that Dalton!!!")
else:
else:
print "Such Dalton doesn't exist!"
print("Such Dalton doesn't exist!")
}}
}}
{{Top}}

<span id="Functions"></span>
==Funktionen==
==Funktionen==


Es gibt nur wenige [http://docs.python.org/reference/lexical_analysis.html#identifiers Standard Python-Befehle]. In der aktuellen Version von Python gibt es etwa 30, und wir kennen bereits mehrere von ihnen. Aber stellen Sie sich vor, wir könnten unsere eigenen Befehle erfinden? Nun, wir können, und es ist extrem einfach. In der Tat, tun die meisten der zusätzlichen Module, die Sie in Ihrer Python-Installation zufügen, genau das, sie fügen Befehle hinzu, die Sie verwenden können. Ein benutzerdefinierter Befehl in Python wird eine Funktion genannt und wird so gemacht:
Es gibt nur sehr wenige [https://docs.python.org/3/reference/lexical_analysis.html#identifiers Standard Python Befehle] und wir kennen bereits einige davon. Aber du kannst deine eigenen Befehle erstellen. Tatsächlich tun die meisten Zusatzmodule, die du in deine Python Installation einbinden kannst, genau das, sie fügen Befehle hinzu, die du verwenden kannst. Ein benutzerdefinierter Befehl wird in Python als Funktion bezeichnet und ist wie folgt aufgebaut:

{{Code|code=
{{Code|code=
def printsqm(myValue):
def printsqm(myValue):
print str(myValue)+" square meters"
print(str(myValue) + " square meters")

printsqm(45)
printsqm(45)
}}
}}
(Ein weiterer Copy-und-Paste Fehler, kopieren Sie nur bis zum Ende des eingerückten Abschnitts, d.h. """square meters""", fügen Sie das in den Interpreter ein, drücken die Eingabetaste, bis die drei Punkte verschwinden und kopieren und fügen dann die letzte Zeile ein).


Extrem einfach: der def()-Befehl definiert eine neue Funktion. Sie geben ihr einen Namen und innerhalb der Klammern Sie Argumente, die wir in unserer Funktionen benutzen werden. Argumente sind Daten, die an die Funktion übergeben werden. Schauen Sie sich zum Beispiel das len()-Kommando an. Wenn Sie lediglich len() schreiben, dann wird Python melden, dass es ein Argument benötigt. Das heißt, Sie möchten len() von irgendwas, stimmt's? Dann schreiben Sie z.B. len(myList) und Sie bekommen die Länge von myList. Nun, myList ist ein Argument, dass Sie die len()-Funktion übergeben. Die len()-Funktion ist so definiert, dass sie weiß, was mit dem übergebenen Wert tun soll. Das Gleiche, was wir hier getan haben.
Der {{incode|def()}} Befehl definiert eine neue Funktion, du gibst ihr einen Namen, und innerhalb der Klammer definierst du die Argumente, die die Funktion verwenden wird. Argumente sind Daten, die an die Funktion übergeben werden. Sieh dir zum Beispiel den {{incode|len()}} Befehl an. Wenn du einfach {{incode|len()}} schreibst, wird Python dir sagen, dass es ein Argument braucht. Was offensichtlich ist: du willst die Länge von etwas wissen. Wenn du {{incode|len(myList)}} schreibst, ist {{incode|myList}} das Argument, das du an die {{incode|len()}} Funktion übergibst. Und die {{incode|len()}} Funktion ist so definiert, dass sie weiß, was sie mit diesem Argument tun soll. Wir haben dasselbe mit unserer {{incode|printsqm}} Funktion getan.

Der {{incode|myValue}} Name kann alles sein, und er wird nur innerhalb der Funktion verwendet. Es ist nur ein Name, den du dem Argument gibst, damit du etwas damit machen kannst. Indem du Argumente definierst, teilst du der Funktion auch mit, wie viele zu erwarten sind. Wenn du das zum Beispiel tust:


Die "myValue"-Bezeichnung kann alles sein, und sie wird nur innerhalb der Funktion benutzt. Es ist nur ein Name, den Sie dem Argument gegeben haben, damit Sie etwas damit tun können, aber es dient auch dazu, der Funktion mitzuteilen, wie viele Argumente zu erwarten sind. Wenn Sie z.B. dies tun:
{{Code|code=
{{Code|code=
printsqm(45,34)
printsqm(45, 34)
}}
}}
gibt es einen Fehler. Unsere Funktion wurde programmiert, nur ein Argument zu erwarten, aber es erhielt zwei, 45 und 34. Wir könnten stattdessen folgendes tun:
{{Code|code=
def sum(val1,val2):
total = val1 + val2
return total


gibt es einen Fehler. Unsere Funktion wurde programmiert, nur ein Argument zu erhalten, aber es erhielt zwei, {{incode|45}} und {{incode|34}}. Versuchen wir ein anderes Beispiel:
sum(45,34)

myTotal = sum(45,34)
}}
Wir haben eine Funktion erstellt, die zwei Argumente bekommt und diesen Wert zurückgibt. Etwas zurückliefern ist sehr sinnvoll, denn wir können etwas mit dem Wert tun, wie etwa in der myTotal-Variable speichern. Da wir im Interpreter sind und alles ausgeben wird, erzeugt die Zeile
{{Code|code=
{{Code|code=
sum(45,34)
def sum(val1, val2):
total = val1 + val2
}}
return total
ein Ergebnis auf dem Bildschirm, aber außerhalb des Interpreters würde nichts auf dem Bildschirm erscheinen, denn es gibt keinen print-Befehl innerhalb der Funktion. Sie müssten folgendes tun

{{Code|code=
print sum(45,34)
myTotal = sum(45, 34)
}}
}}
um eine Ausgabe zu erhalten. Lesen Sie [http://www.diveintopython.net/getting_to_know_python/declaring_functions.html hier] mehr über Funktionen.


Hier haben wir eine Funktion erstellt, die zwei Argumente empfängt, sie summiert und diesen Wert zurückgibt. Etwas zurückzugeben ist sehr nützlich, da wir mit dem Ergebnis etwas tun können, wie es z.B. in der Variablen {{incode|myTotal}} speichern können.
{{Top}}
<span id="Modules"></span>
==Module==
==Module==


Da wir jetzt einen guten Überblick haben, wie Python arbeitet, müssen wir abschließend noch eins wissen: Wie arbeitet man mit Dateien und Modulen.
Nun, da du eine gute Vorstellung davon hast, wie Python funktioniert, musst du noch eine weitere Sache wissen: Wie man mit Dateien und Modulen arbeitet.


Bis jetzt haben wir Python Anweisungen Zeile für Zeile in den Interpreter geschrieben. Diese Methode ist für größere Programme offensichtlich nicht geeignet. Normalerweise wird der Code für Python Programme in Dateien mit der Erweiterung {{FileName|.py}} gespeichert. Dabei handelt es sich nur um einfache Textdateien, die mit einem beliebigen Texteditor (Linux gedit, emacs, vi oder sogar Windows Notepad) erstellt und bearbeitet werden können.
Bis jetzt haben wir Python-Anweisungen Zeile für Zeile in den Interpreter eingegeben, stimmt's? Was, wenn wir mehrere Zeilen zusammenschreiben und sie alle gemeinsam ausführen könnten? Es wäre einfacher, um komplexere Dinge zu tun. Und wir könnten unsere Arbeit außerdem speichern. Nun, auch das ist sehr einfach. Öffnen Sie einen Text-Editor (wie das Windows-Notepad, Linux gedit, emacs oder vi) und schreiben Sie alle Ihre Python-Zeile, wie Sie das im Interpreter getan haben, mit Einrückungen, usw. Speichern Sie dann die Datei irgendwo, am besten mit einer .py-Endung. Dadurch haben Sie ein komplettes Python-Programm. Natürlich gibt es viel bessere Editoren als Notepad, aber es geht nur darum Ihnen zu zeigen, dass ein Python-Programm nichts anderes ist als eine Textdatei.

Es gibt mehrere Möglichkeiten, ein Python Programm auszuführen. Unter Windows klicke einfach mit der rechten Maustaste auf deine Datei, öffne sie mit Python und führe sie aus. Du kannst sie aber auch aus dem Python Interpreter selbst heraus ausführen. Dazu muss der Interpreter wissen, wo sich dein Programm befindet. In FreeCAD ist es am einfachsten, dein Programm in einem Ordner abzulegen, den der Python Interpreter von FreeCAD standardmäßig kennt, z.B. im Ordner {{FileName|Mod}} des FreeCAD Anwenders:
* Unter Linux ist es normalerweise {{FileName|/home/<username>/.local/share/FreeCAD/Mod/}} ({{VersionPlus/de|0.20}}) or {{FileName|/home/<username>/.FreeCAD/Mod/}} ({{VersionMinus/de|0.19}}).
* Unter Windows ist es {{FileName|%APPDATA%\FreeCAD\Mod\}}, was normalerweise {{FileName|C:\Users\<username>\Appdata\Roaming\FreeCAD\Mod\}} ist.
* Unter macOS ist dies normalerweise {{FileName|/Users/<username>/Library/Application Support/FreeCAD/Mod/}}.
Fügen wir dort einen Unterordner namens {{FileName|scripts}} hinzu und schreiben dann eine Datei wie diese:


Um dieses Programm mit Python auszuführen, gibt es hunderte von Wegen. In Windows rechtsklicken Sie die Datei, öffnen sie mit Python und führen sie aus. Aber Sie können Sie auch vom Python-Interpreter ausführen. Dafür muss der Interpreter wissen, wo Ihr .py-Programm ist. In FreeCAD ist der einfachste Weg, Ihr Programm an einer Stelle abzulegen, die dem FreeCAD-Python-Interpreter bekannt ist, wie z.B. das FreeCAD-bin-Verzeichnis, oder eins der Mod-Verzeichnisse. (Unter Linux haben Sie vermutlich ein Verzeichnis /home/<Benutzername>/.FreeCAD/Mod, lassen Sie uns darunter ein Unterverzeichnis namens scripts erstellen, in dem wir die Textdatei ablegen). Nehmen wir an, wir schreiben eine Datei mit dem folgenden Inhalt:
{{Code|code=
{{Code|code=
def sum(a,b):
def sum(a,b):
return a + b
return a + b


print "myTest.py succesfully loaded"
print("myTest.py succesfully loaded")
}}
}}


Speichere die Datei als {{FileName|myTest.py}} im {{FileName|scripts}} Ordner und schreibe in das Interpreterfenster:
und speichern sie als myTest.py in unserem FreeCAD/bin-Verzeichnis (oder auf Linux in /home/<Benutzername>/.FreeCAD/mod/scripts). Lassen Sie uns nun FreeCAD starten und im Interpreter-Fenster eingeben:

{{Code|code=
{{Code|code=
import myTest
import myTest
}}
}}
ohne die py-Endung. Dies wird einfach den Inhalt der Datei ausführen, Zeile für Zeile, so als hätten wir es im Interpreter eingegeben. Die sum-Funktion wird angelegt und die Meldung ausgegeben. Es gibt einen großen Unterschied: Das import-Kommando ist nicht nur gemacht, um Programme in Dateien auszuführen, sondern auch die darin enthaltenen Funktionen zu laden, so dass sie im Interpreter verfügbar sind. Dateien, die Funktionen enthalten, so wie unsere, werden Module genannt.


ohne die {{FileName|.py}} Erweiterung. Dadurch wird der Inhalt der Datei Zeile für Zeile so ausgeführt, als ob wir ihn im Interpreter geschrieben hätten. Die Summenfunktion wird erstellt, und die Nachricht wird gedruckt. Dateien, die Funktionen enthalten, wie unsere, werden Module genannt.
Normalerweise, wenn wir eine sum()-Funktion im Interpreter eingeben, führen wir sie ganz einfach wie folgt aus

Wenn wir eine {{incode|sum()}} Funktion im Interpreter schreiben, führen wir sie so aus:

{{Code|code=
{{Code|code=
sum(14,45)
sum(14, 45)
}}
}}

wie vorher aus. Wenn wir ein Modul mit unserer sum()-Funktion importieren, ist die Syntax ein wenig anders. Wir schreiben:
Aber wenn wir ein Modul importieren, das eine {{incode|sum()}} Funktion enthält, ist die Syntax etwas anders:

{{Code|code=
{{Code|code=
myTest.sum(14,45)
myTest.sum(14, 45)
}}
}}
Das bedeutet, das Modul wird als ein "Container" importiert und alle seine Funktionen sind intern. Das ist sehr nützlich, denn wir können eine Menge von Modulen importieren und alles bleibt gut organisiert. Allgemein, überall dort, wo Sie '''etwas.etwasAnderes''' sehen, mit einem Punkt dazwischen, bedeutet es, '''etwasAnderes''' ist innerhalb von '''etwas'''.


Das heißt, das Modul wird als "Container" importiert, und alle seine Funktionen befinden sich innerhalb dieses Containers. Das ist sehr nützlich, denn wir können viele Module importieren und alles gut organisiert halten. Wenn du {{incode|something.somethingElse}}, mit einem Punkt dazwischen, siehst, dann bedeutet dies, dass {{incode|somethingElse}} sich innerhalb von {{incode|something}} befindet.
Wir können unsere sum()-Funktion auch wie folgt direkt in den Interpreter-Hauptbereich importieren:

Wir können unsere sum() Funktion auch direkt in den Hauptinterpreterraum importieren:

{{Code|code=
{{Code|code=
from myTest import *
from myTest import *
sum(12,54)
sum(12, 54)
}}
}}
Generell verhalten sich alle Module auf diese Weise. Sie importieren ein Modul und Sie können die Funktionen benutzen: modul.funktion(argument). Fast alle Module tun das: sie definieren Funktionen, neue Datentypen und Klassen, die Sie im Interpreter oder Ihren eigenen Python-Modulen benutzen können, denn nichts hindert Sie daran, andere Module in Ihre Module zu importieren!


Fast alle Module tun dies: Sie definieren Funktionen, neue Datentypen und Klassen, die du im Interpreter oder in deinen eigenen Python Modulen verwenden kannst, denn nichts hindert dich daran, andere Module innerhalb deines Moduls zu importieren!
Ein letzter extrem nützlicher Punkt. Woher wissen wir, welche Funktionen verfügbar und wie sie zu benutzen sind (d.h., welche Art von Argumenten erwarten sie)? Wir haben bereits gesehen, dass Python eine help()-Funktion hat. Ausführen von:

Woher wissen wir, welche Module wir haben, welche Funktionen darin enthalten sind und wie sie zu verwenden sind (d.h. welche Art von Argumenten sie brauchen)? Wir haben bereits gesehen, dass Python eine {{incode|help()}} Funktion hat. Mache:

{{Code|code=
{{Code|code=
help()
help("modules")
modules
}}
}}

liefert uns eine Liste aller verfügbarer Module. Durch können durch Eintippen von '''q''' die interaktive Hilfe verlassen und irgendeins importieren. Wir können mit dem dir()-Kommando sogar den Inhalt ansehen.
wird uns eine Liste aller verfügbaren Module geben. Wir können jedes von ihnen importieren und ihren Inhalt mit dem Befehl {{incode|dir()}} durchsuchen:

{{Code|code=
{{Code|code=
import math
import math
dir(math)
dir(math)
}}
}}
Wir sehen all die im math-Modul enthaltenen Funktionen, genau wie merkwürdiges Zeug namens __doc__, __file__, __name__. __doc__ ist sehr nützlich, denn es ist Dokumentation. Jede Funktion von (gut gemachten) Modulen hat einen __doc__-Abschnitt, der die Nutzung beschreibt. Wir sehen zum Beispiel, dass es eine sin-Funktion im math-Modul gibt. Wollen Sie wissen, wie man sie benutzt?
{{Code|code=
print math.sin.__doc__
}}
(Es mag nicht klar ersichtlich sein, aber auf jeder Seite von doc gibt es zwei Unterstriche).


Wir werden alle Funktionen sehen, die im {{incode|math}} modul enthalten sind, sowie seltsame Dinge namens {{incode|__doc__}}, {{incode|__file__}}, {{incode|__name__}}. Jede Funktion in einem gut gemachten Modul hat eine {{incode|__doc__}}, die erklärt, wie man sie benutzt. Zum Beispiel sehen wir, dass es eine {{incode|sin()}} Funktion innerhalb des Mathematikmoduls gibt. Möchtest Du wissen, wie man sie benutzt?
Und abschließend ein letztes kleines Goodie: Wenn wir an einem neuen oder existierenden Modul arbeiten, ist es am besten, die Dateiendung durch .py zu ersetzen, also myModule.FCMacro => myModule.py. Wir werden es oft testen, also werden wir es wie oben gezeigt laden.
{{Code|code=
{{Code|code=
print(math.sin.__doc__)
import myModule
myModule.myTestFunction()
}}
}}
Wenn wir aber sehen, dass myTestFunction() nicht korrekt funktioniert? Wir gehen zurück in den Editor und machen Änderungen. Dann, anstatt den Interpreter zu schließen und erneut zu öffnen, können wir das Modul einfach wie folgt aktualisieren:
{{Code|code=
reload(myModule)
}}
Die Umbenennung der Datei ist notwendig, weil Python nicht weiß, was es mit der Endung FCMacro anfangen soll.


Es mag nicht offensichtlich sein, aber auf beiden Seiten von {{incode|doc}} sind zwei Unterstreichungszeichen.
Es gibt jedoch zwei Alternativen: im Makro nutzen Sie Pythons exec- oder execfile-Funktionen.

Und zum Schluss noch ein letzter Tipp: Bei der Arbeit an neuem oder bestehendem Code ist es besser, nicht die FreeCAD Makro Dateierweiterung {{FileName|.FCMacro}} zu verwenden, sondern stattdessen die Standard Erweiterung {{FileName|.py}}. Der Grund dafür ist, dass Python die Erweiterung {{FileName|.FCMacro}} nicht kennt. Wenn du {{FileName|.py}} verwendest, kann dein Code einfach mit {{incode|import}} geladen werden, wie wir bereits gesehen haben, und auch mit {{incode|importlib.reload()}} neu geladen werden:

{{Code|code=
{{Code|code=
import importlib
f = open("myModule","r")
importlib.reload(myTest)
d = f.read()
exec d
}}
}}

oder
Es gibt jedoch eine Alternative:
{{Code|code=
execfile "myModule"
}}
For Python 3.xxx replace this code with:


{{Code|code=
{{Code|code=
exec(open("C:/PathToMyMacro/myMacro.FCMacro").read())
exec(open("C:/PathToMyMacro/myMacro.FCMacro").read())
}}
}}
{{Top}}
<span id="Starting_with_FreeCAD"></span>
==Loslegen mit FreeCAD==


Hoffentlich hast du nun eine gute Vorstellung davon, wie Python funktioniert, und du kannst damit beginnen, zu erkunden, was FreeCAD zu bieten hat. Die Python Funktionen von FreeCAD sind alle gut in verschiedenen Modulen organisiert. Einige von ihnen sind bereits geladen (importiert), wenn du FreeCAD startest. Probiere einfach:
Um Code in verschiedenen Makros gemeinsam zu nutzen, kann das FreeCAD- oder FreeCADGui-Modul (oder ein beliebiges anderes Modul) genutzt werden, indem man ein beliebiges Attribut darin setzt. Dieses sollte die Ausführung des Makros überleben.
{{Code|code=
import FreeCAD
if hasattr(FreeCAD,"macro2_executed"):
...
else:
FreeCAD.macro2_executed = True # you can assign any value because we only check for the existence of the attribute
... execute macro2
}}

==Loslegen mit FreeCAD==


Nun, ich glaube, Sie haben jetzt eine gute Vorstellung davon, wie Python funktioniert, und Sie können anfangen zu erforschen, was FreeCAD anzubieten hat. Die Python-Funktionen von FreeCAD werden alle gut in verschiedenen Modulen organisiert. Einige von ihnen werden bereits (importiert) geladen, wenn Sie FreeCAD starten. Also, nur eingeben
{{Code|code=
{{Code|code=
dir()
dir()
}}
}}
{{Top}}
und lesen Sie auf [[FreeCAD Scripting Basics/de|FreeCAD Scripting Grundkenntnisse]].
<span id="Notes"></span>
==Hinweise==


* FreeCAD wurde ursprünglich für die Arbeit mit Python 2 entwickelt. Da Python 2 im Jahr 2020 das Ende seiner Lebensdauer erreicht hat, wird die zukünftige Entwicklung von FreeCAD ausschließlich mit Python 3 erfolgen, und Rückwärtskompatibilität wird nicht unterstützt.
Natürlich sahen wir hier nur einen sehr kleinen Teil der Python-Welt. Es gibt viele wichtige Konzepte, die wir hier nicht erwähnten. Es gibt drei sehr wichtige Python-Bezugsdokumente im Netz:
* Viele weitere Informationen über Python findest du im [https://docs.python.org/3/tutorial/index.html offiziellen Python Tutorium] und in der [https://docs.python.org/3/reference/ offiziellen Python Referenz].
* die [http://docs.python.org/reference/ official Python reference]
{{Top}}
* die [http://wiki.python.org/moin/GermanLanguage Deutsche Seite mit Links zu Python]
* das [http://www.diveinto.org/python3/ Dive into Python] wikibook/ book
Vieleicht wollen Sie ja Lesezeichen dazu anlegen...?


{{Docnav/de

|[[Scripts/de|Skripte]]
{{docnav/de
|[[Python_scripting_tutorial/de|Python Skripterstellung Tutorium]]
|[[Macros/de|Makros ]]
|[[Python scripting tutorial/de|Python TutorialSkripten ]]
}}
}}


{{Powerdocnavi{{#translation:}}}}
{{Userdocnavi/de}}
[[Category:Developer Documentation{{#translation:}}]]

[[Category:Poweruser Documentation/de]]
[[Category:Python Code{{#translation:}}]]

[[Category:Python_Code]]
{{clear}}

Latest revision as of 20:47, 27 April 2023

Einführung

Dies ist ein kurzes Tutorium für diejenigen, die neu bei Python sind. Python ist eine quelloffene, plattformübergreifende Programmiersprache. Sie verfügt über mehrere Funktionen, die sie von anderen Programmiersprachen unterscheidet, und ist für neue Benutzer sehr zugänglich:

  • Sie wurde so gestaltet, dass sie für Menschen lesbar ist, so dass sie relativ leicht zu erlernen und zu verstehen ist.
  • Sie wird interpretiert, das bedeutet, dass Programme nicht erst kompiliert werden müssen, bevor sie ausgeführt werden können. Python Code kann sofort ausgeführt werden, auch Zeile für Zeile, wenn du es wünschst.
  • Sie kann als Skriptsprache in andere Programme eingebettet werden. FreeCAD hat einen eingebetteten Python Interpreter. Du kannst Python Code schreiben, um Teile von FreeCAD zu verändern. Dies ist sehr mächtig, es bedeutet, daß du deine eigenen Werkzeuge bauen kannst.
  • Sie ist erweiterbar, du kannst einfach neue Module in deine Python Installation einbauen und deren Funktionalität erweitern. Zum Beispiel gibt es Module, die es Python erlauben, Bilder zu lesen und zu schreiben, mit Twitter zu kommunizieren, Aufgaben zu planen, die von deinem Betriebssystem ausgeführt werden sollen, usw.

Das Folgende ist eine sehr grundlegende Einführung und keineswegs ein vollständiges Tutorium. Aber sie wird hoffentlich einen guten Ausgangspunkt für die weitere Erforschung von FreeCAD und seinen Mechanismen bieten. Wir empfehlen dir dringend, die untenstehenden Code Schnipsel in einen Python Interpreter einzugeben.

Der Interpreter

Gewöhnlich öffnest du beim Schreiben von Computerprogrammen einen Texteditor oder deine spezielle Programmierumgebung (die im Grunde ein Texteditor mit einigen zusätzlichen Werkzeugen ist), schreibst dein Programm, kompilierst und führst es dann aus. Oftmals wurden bei der Eingabe ein oder mehrere Fehler gemacht, so dass dein Programm nicht funktioniert. Möglicherweise erhälst du sogar eine Fehlermeldung, die dir mitteilt, was schief gelaufen ist. Dann gehe zurück zu deinem Texteditor, korrigiere die Fehler, laufe erneut durch und wiederhole dies, bis dein Programm wie beabsichtigt funktioniert.

In Python kann dieser ganze Prozess transparent im Python Interpreter ausgeführt werden. Der Interpreter ist ein Python Fenster mit einer Eingabeaufforderung, wo du einfach Python Code eintippen kannst. Wenn du Python auf deinem Computer installiert hast (Herunterladen von der Python Webseite, wenn du es auf Windows- oder Mac benutzt, installiere es von deinem Paket Repositorium, wenn du auf GNU/ Linux installierst). Aber, wie bereits erwähnt, hat FreeCAD auch einen eingebauten Python Interpreter: die Python Konsole.

Die FreeCAD Python Konsole

Wenn du sie nicht siehst, klicke auf Ansicht → Paneele → Python Konsole. Die Python Konsole kann in der Größe verändert und auch wieder abgedockt werden.

Der Interpreter zeigt die Python Version, dann ein >>> Symbol, das ist die Eingabeaufforderung, das heißt, hier geben Sie Python-Code ein. Schreiben von Code im Interpreter ist einfach: eine Zeile ist eine Anweisung. Wenn du Enter drückst, wird dein Code Zeile ausgeführt (nachdem sie sofort und unsichtbar kompiliert wurde). Zum Beispiel, versuche dies zu schreiben:

print("hello")

print() ist ein Python Befehl, der natürlich, etwas auf den Bildschirm druckt. Wenn du die Eingabetaste drückst, wird die Operation ausgeführt, und die Nachricht "Hallo" wird gedruckt. Wenn du einen Fehler machst, schreiben wir zum Beispiel:

print(hello)

Python wird dir dies sofort mitteilen. In diesem Fall weiß Python nicht, was hallo ist. Die " " Zeichen geben an, dass der Inhalt eine Zeichenfolge ist, d.h. Programmierjargon für ein Stück Text. Ohne diese Zeichen erkennt der print() Befehl nicht hello. Durch Drücken des Pfeils nach oben kannst du zur letzten Codezeile zurückgehen und diese korrigieren.

Der Python Interpreter hat auch ein eingebautes Hilfesystem. Nehmen wir an, wir verstehen nicht, was mit print(hello) schief gelaufen ist, und wir wollen konkrete Informationen über den Befehl:

help("print")

Du erhältst eine lange und vollständige Beschreibung von allem, was der print() Befehl tun kann.

Jetzt, da du den Python Interpreter verstehst, können wir mit den ernsteren Dingen fortfahren.

Anfang

Variablen

Sehr oft musst du beim Programmieren einen Wert unter einem Namen speichern. An dieser Stelle kommen Variablen ins Spiel. Gib zum Beispiel dies ein:

a = "hello"
print(a)

Du verstehst wahrscheinlich, was hier passiert ist, wir haben die Zeichenfolge "hello" unter dem Namen a gespeichert. Jetzt, da a bekannt ist, können wir sie überall verwenden, zum Beispiel im print() Befehl. Wir können jeden beliebigen Namen verwenden, wir müssen nur einige einfache Regeln befolgen, wie z.B. keine Leerzeichen oder Interpunktion und keine Python Schlüsselwörter verwenden. Wir können zum Beispiel schreiben:

hello = "my own version of hello"
print(hello)

Nun ist hallo nicht mehr undefiniert. Variablen können jederzeit geändert werden, deshalb nennt man sie Variablen, ihr Inhalt kann variieren. Zum Beispiel:

myVariable = "hello"
print(myVariable)
myVariable = "good bye"
print(myVariable)

Wir haben den Wert von myVariable geändert. Wir können auch Variablen kopieren:

var1 = "hello"
var2 = var1
print(var2)

Es ist ratsam, deinen Variablen aussagekräftige Namen zu geben. Nach einer Weile wirst du dich nicht mehr daran erinnern, was deine Variable mit dem Namen a darstellt. Aber wenn du sie zum Beispiel myWelcomeMessage genannt hast, wirst du dich leicht an ihren Zweck erinnern. Außerdem ist dein Code einen Schritt näher an der Selbst-erklärend.

Der Fall ist sehr wichtig, myVariable ist nicht dasselbe wie myvariable. Wenn du print(myvariable) eingeben würdest, würde es mit einem Fehler als nicht definiert zurückgegeben werden.

Anfang

Zahlen

Natürlich können Python Programme mit allen Arten von Daten umgehen, nicht nur mit Textzeichenfolgen. Eine Sache ist wichtig, Python muss wissen, mit welcher Art von Daten es zu tun hat. Wir haben in unserem Hallo Druck Beispiel gesehen, dass der Befehl print() unsere "hallo" Zeichenfolge erkannt hat. Durch die Verwendung von " " Zeichen haben wir festgelegt, dass das, was folgt, eine Textzeichenfolge ist.

Wir können immer den Datentyp einer Variablen überprüfen, mit dem type() Befehl:

myVar = "hello"
type(myVar)

Es wird uns sagen, der Inhalt von myVar ist ein 'str', was die Kurzform für Zeichenfolge ist. Wir haben auch andere grundlegende Datentypen wie Integer und Gleitkomma Zahlen:

firstNumber = 10
secondNumber = 20
print(firstNumber + secondNumber)
type(firstNumber)

Python weiß, dass 10 und 20 ganze Zahlen sind, also werden sie als 'int' gespeichert, und Python kann mit ihnen alles machen, was es mit ganzen Zahlen machen kann. Schaue dir die Ergebnisse davon an:

firstNumber = "10"
secondNumber = "20"
print(firstNumber + secondNumber)

Hier haben wir Python gezwungen, zu bedenken, dass unsere beiden Variablen keine Zahlen, sondern Textstücke sind. Python kann zwei Textstücke zusammenfügen, obwohl es in diesem Fall natürlich keine Arithmetik ausführt. Aber wir sprachen über ganze Zahlen. Es gibt auch Gleitkommazahlen. Der Unterschied ist, dass Gleitkommazahlen einen Dezimalteil haben können und Ganzzahlen nicht:

var1 = 13
var2 = 15.65
print("var1 is of type ", type(var1))
print("var2 is of type ", type(var2))

Ganzzahlen und Gleitkommazahlen können problemlos miteinander gemischt werden:

total = var1 + var2
print(total)
print(type(total))

Da var2 ein Gleitkommawert ist, entscheidet Python automatisch, dass das Ergebnis ebenfalls ein Gleitkommawert sein muss. Aber es gibt Fälle, in denen Python nicht weiß, welchen Typ es verwenden soll. Zum Beispiel:

varA = "hello 123"
varB = 456
print(varA + varB)

Dies führt zu einem Fehler, varA ist eine Zeichenfolge und varB ist eine ganze Zahl, und Python weiß nicht, was zu tun ist. Wir können Python jedoch zwingen, zwischen den Typen zu konvertieren:

varA = "hello"
varB = 123
print(varA + str(varB))

Nun, da beide Variablen Zeichenfolgen sind, funktioniert die Operation. Beachte, dass wir varB zum Zeitpunkt des Drucks "zeichenfolgenfiziert" haben, aber varB selbst nicht geändert haben. Wenn wir varB dauerhaft in eine Zeichenfolge verwandeln wollten, müssten wir dies tun:

varB = str(varB)

Wir können auch int() und float() einsetzen, um Werte zu konvertieren in Ganzzahlen und Gleitkommazahlen, wenn wir wollen:

varA = "123"
print(int(varA))
print(float(varA))

Du hast sicher bemerkt, dass wir den Befehl print() auf verschiedene Weise verwendet haben. Wir haben Variablen, Summen, verschiedene durch Kommas getrennte Dinge und sogar das Ergebnis eines anderen Pythonbefehls gedruckt. Vielleicht hast du auch gesehen, dass diese beiden Befehle:

type(varA)
print(type(varA))

das gleiche Ergebnis haben. Das liegt daran, dass wir uns im Interpreter befinden, und alles wird automatisch ausgedruckt. Wenn wir komplexere Programme schreiben, die außerhalb des Interpreters laufen, werden sie nicht automatisch gedruckt, so dass wir den Befehl print() verwenden müssen. Mit diesem Gedanken im Hinterkopf sollten wir ihn hier nicht mehr verwenden. Von nun an werden wir einfach schreiben:

myVar = "hello friends"
myVar

Anfang

Listen

Ein weiterer nützlicher Datentyp ist eine Liste. Eine Liste ist eine Sammlung von anderen Daten. Um eine Liste zu definieren, verwenden wir [ ]:

myList = [1, 2, 3]
type(myList)
myOtherList = ["Bart", "Frank", "Bob"]
myMixedList = ["hello", 345, 34.567]

Wie du siehst, kann eine Liste jede Art von Daten enthalten. Mit einer Liste kannst du viele Dinge tun. Zum Beispiel kannst du deine Elemente zählen:

len(myOtherList)

Oder ein Element abrufen:

myName = myOtherList[0]
myFriendsName = myOtherList[1]

Während der len() Befehl die Gesamtzahl der Elemente in einer Liste zurückgibt, steht das erste Element in einer Liste immer an der Position len, so dass in unserer myOtherList "Bob" wird an der Position 2 stehen. Mit Listen können wir viel mehr tun, z.B. Artikel sortieren und Artikel entfernen oder hinzufügen.

Interessanterweise ist eine Textzeichenfolge einer Liste von Zeichen in Python sehr ähnlich. Versuche dies zu tun:

myvar = "hello"
len(myvar)
myvar[2]

Normalerweise kann das, was du mit Listen machen kannst, auch mit Zeichenketten gemacht werden. Tatsächlich sind sowohl Listen als auch Zeichenketten Sequenzen.

Neben Zeichenketten, Ganzzahlen, Gleitkommazahlen und Listen gibt es weitere eingebaute Datentypen, wie z.B. Wörterbücher, und du kannst sogar eigene Datentypen mit Klassen erstellen.

Anfang

Einrückung

Ein wichtiger Nutzen von Listen ist die Möglichkeit, sie "durchzublättern" und mit jedem Punkt etwas zu tun. Sieh dir zum Beispiel das hier an:

alldaltons = ["Joe", "William", "Jack", "Averell"]
for dalton in alldaltons:
    print(dalton + " Dalton")

Wir iterierten (Programmierjargon) durch unsere Liste mit dem Befehl for in und machten etwas mit jedem der Punkte. Beachte die spezielle Syntax: Der Befehl for endet mit : und zeigt an, dass es sich bei dem folgenden Befehl um einen Block mit einem oder mehreren Befehlen handelt. Im Interpreter wechselt die Eingabeaufforderung unmittelbar nach der Eingabe der Befehlszeile, die mit : endet, zu ..., was bedeutet, dass Python weiß, dass noch mehr kommen wird.

Woher wird Python wissen, wie viele der nächsten Zeilen innerhalb der Operation for in ausgeführt werden müssen? Python verlässt sich dabei auf Einrückung. Die nächsten Zeilen müssen mit einem Leerzeichen, oder mehreren Leerzeichen, oder einem Tabulator, oder mehreren Tabulatoren beginnen. Und solange die Einrückung gleich bleibt, werden die Zeilen als Teil des for in Blocks betrachtet. Wenn du eine Zeile mit 2 Leerzeichen und die nächste mit 4 beginnst, gibt es einen Fehler. Wenn du fertig bist, schreibe einfach eine weitere Zeile ohne Einrückung, oder drücke Enter, um vom for in Block zurückzukehren

Die Einrückung trägt auch zur Lesbarkeit des Programms bei. Wenn du beim Schreiben eines großen Programms große Einrückungen verwendest (z.B. Tabulatoren anstelle von Leerzeichen verwendest), hast du einen klaren Überblick darüber, was innerhalb von was ausgeführt wird. Wir werden sehen, dass auch andere Befehle eingerückte Codeblöcke verwenden.

Der for in Befehl kann für viele Dinge verwendet werden, die mehr als einmal ausgeführt werden müssen. Er kann z.B. mit dem Befehl range() kombiniert werden:

serie = range(1, 11)
total = 0
print("sum")
for number in serie:
    print(number)
    total = total + number
print("----")
print(total)

Wenn du die Code Beispiele in einem Interpreter durch Kopieren und Einfügen ausgeführt hast, wirst du feststellen, dass der vorherige Textblock einen Fehler auslöst. Kopiere stattdessen an das Ende des eingerückten Blocks, d.h. an das Ende der Zeile total = total + number und füge dann im Interpreter ein. Drücke im Interpreter Enter, bis die Eingabeaufforderung mit den drei Punkten verschwindet und der Code ausgeführt wird. Kopiere dann die letzten beiden Zeilen, gefolgt von einer weiteren Enter. Die endgültige Antwort sollte erscheinen.

Wenn du in den Interpreter help(range) eintippst, wirst du sehen:

range(...)
    range(stop) -> list of integers
    range(start, stop[, step]) -> list of integers

Hier bezeichnen die eckigen Klammern einen optionalen Parameter. Es wird jedoch erwartet, dass es sich bei allen Parametern um ganze Zahlen handelt. Im Folgenden erzwingen wir mit int(), dass der Schrittparameter eine ganze Zahl ist:

number = 1000
for i in range(0, 180 * number, int(0.5 * number)):
    print(float(i) / number)

Ein weiteres range() Beispiel:

alldaltons = ["Joe", "William", "Jack", "Averell"]
for n in range(4):
    print(alldaltons[n], " is Dalton number ", n)

Der range() Befehl hat auch die seltsame Besonderheit, dass er mit 0 beginnt (wenn du die Startnummer nicht angibst) und dass seine letzte Nummer um eins kleiner ist als die von dir angegebene Endnummer. Das ist natürlich, damit es gut mit anderen Python Befehlen funktioniert. Zum Beispiel:

alldaltons = ["Joe", "William", "Jack", "Averell"]
total = len(alldaltons)
for n in range(total):
    print(alldaltons[n])

Eine weitere interessante Verwendung von eingerückten Blöcken ist der Befehl if. Dieser Befehl führt einen Codeblock nur dann aus, wenn z.B. eine bestimmte Bedingung erfüllt ist:

alldaltons = ["Joe", "William", "Jack", "Averell"]
if "Joe" in alldaltons:
    print("We found that Dalton!!!")

Natürlich wird dabei immer der Satz gedruckt, aber versuche, die zweite Zeile zu ersetzen mit:

if "Lucky" in alldaltons:

Dann wird nichts ausgegeben. Wir können auch eine else Anweisung angeben:

alldaltons = ["Joe", "William", "Jack", "Averell"]
if "Lucky" in alldaltons:
    print("We found that Dalton!!!")
else:
    print("Such Dalton doesn't exist!")

Anfang

Funktionen

Es gibt nur sehr wenige Standard Python Befehle und wir kennen bereits einige davon. Aber du kannst deine eigenen Befehle erstellen. Tatsächlich tun die meisten Zusatzmodule, die du in deine Python Installation einbinden kannst, genau das, sie fügen Befehle hinzu, die du verwenden kannst. Ein benutzerdefinierter Befehl wird in Python als Funktion bezeichnet und ist wie folgt aufgebaut:

def printsqm(myValue):
    print(str(myValue) + " square meters")

printsqm(45)

Der def() Befehl definiert eine neue Funktion, du gibst ihr einen Namen, und innerhalb der Klammer definierst du die Argumente, die die Funktion verwenden wird. Argumente sind Daten, die an die Funktion übergeben werden. Sieh dir zum Beispiel den len() Befehl an. Wenn du einfach len() schreibst, wird Python dir sagen, dass es ein Argument braucht. Was offensichtlich ist: du willst die Länge von etwas wissen. Wenn du len(myList) schreibst, ist myList das Argument, das du an die len() Funktion übergibst. Und die len() Funktion ist so definiert, dass sie weiß, was sie mit diesem Argument tun soll. Wir haben dasselbe mit unserer printsqm Funktion getan.

Der myValue Name kann alles sein, und er wird nur innerhalb der Funktion verwendet. Es ist nur ein Name, den du dem Argument gibst, damit du etwas damit machen kannst. Indem du Argumente definierst, teilst du der Funktion auch mit, wie viele zu erwarten sind. Wenn du das zum Beispiel tust:

printsqm(45, 34)

gibt es einen Fehler. Unsere Funktion wurde programmiert, nur ein Argument zu erhalten, aber es erhielt zwei, 45 und 34. Versuchen wir ein anderes Beispiel:

def sum(val1, val2):
    total = val1 + val2
    return total

myTotal = sum(45, 34)

Hier haben wir eine Funktion erstellt, die zwei Argumente empfängt, sie summiert und diesen Wert zurückgibt. Etwas zurückzugeben ist sehr nützlich, da wir mit dem Ergebnis etwas tun können, wie es z.B. in der Variablen myTotal speichern können.

Anfang

Module

Nun, da du eine gute Vorstellung davon hast, wie Python funktioniert, musst du noch eine weitere Sache wissen: Wie man mit Dateien und Modulen arbeitet.

Bis jetzt haben wir Python Anweisungen Zeile für Zeile in den Interpreter geschrieben. Diese Methode ist für größere Programme offensichtlich nicht geeignet. Normalerweise wird der Code für Python Programme in Dateien mit der Erweiterung .py gespeichert. Dabei handelt es sich nur um einfache Textdateien, die mit einem beliebigen Texteditor (Linux gedit, emacs, vi oder sogar Windows Notepad) erstellt und bearbeitet werden können.

Es gibt mehrere Möglichkeiten, ein Python Programm auszuführen. Unter Windows klicke einfach mit der rechten Maustaste auf deine Datei, öffne sie mit Python und führe sie aus. Du kannst sie aber auch aus dem Python Interpreter selbst heraus ausführen. Dazu muss der Interpreter wissen, wo sich dein Programm befindet. In FreeCAD ist es am einfachsten, dein Programm in einem Ordner abzulegen, den der Python Interpreter von FreeCAD standardmäßig kennt, z.B. im Ordner Mod des FreeCAD Anwenders:

  • Unter Linux ist es normalerweise /home/<username>/.local/share/FreeCAD/Mod/ (Version 0.20 und darüber) or /home/<username>/.FreeCAD/Mod/ (Version 0.19 und darunter).
  • Unter Windows ist es %APPDATA%\FreeCAD\Mod\, was normalerweise C:\Users\<username>\Appdata\Roaming\FreeCAD\Mod\ ist.
  • Unter macOS ist dies normalerweise /Users/<username>/Library/Application Support/FreeCAD/Mod/.

Fügen wir dort einen Unterordner namens scripts hinzu und schreiben dann eine Datei wie diese:

def sum(a,b):
    return a + b

print("myTest.py succesfully loaded")

Speichere die Datei als myTest.py im scripts Ordner und schreibe in das Interpreterfenster:

import myTest

ohne die .py Erweiterung. Dadurch wird der Inhalt der Datei Zeile für Zeile so ausgeführt, als ob wir ihn im Interpreter geschrieben hätten. Die Summenfunktion wird erstellt, und die Nachricht wird gedruckt. Dateien, die Funktionen enthalten, wie unsere, werden Module genannt.

Wenn wir eine sum() Funktion im Interpreter schreiben, führen wir sie so aus:

sum(14, 45)

Aber wenn wir ein Modul importieren, das eine sum() Funktion enthält, ist die Syntax etwas anders:

myTest.sum(14, 45)

Das heißt, das Modul wird als "Container" importiert, und alle seine Funktionen befinden sich innerhalb dieses Containers. Das ist sehr nützlich, denn wir können viele Module importieren und alles gut organisiert halten. Wenn du something.somethingElse, mit einem Punkt dazwischen, siehst, dann bedeutet dies, dass somethingElse sich innerhalb von something befindet.

Wir können unsere sum() Funktion auch direkt in den Hauptinterpreterraum importieren:

from myTest import *
sum(12, 54)

Fast alle Module tun dies: Sie definieren Funktionen, neue Datentypen und Klassen, die du im Interpreter oder in deinen eigenen Python Modulen verwenden kannst, denn nichts hindert dich daran, andere Module innerhalb deines Moduls zu importieren!

Woher wissen wir, welche Module wir haben, welche Funktionen darin enthalten sind und wie sie zu verwenden sind (d.h. welche Art von Argumenten sie brauchen)? Wir haben bereits gesehen, dass Python eine help() Funktion hat. Mache:

help("modules")

wird uns eine Liste aller verfügbaren Module geben. Wir können jedes von ihnen importieren und ihren Inhalt mit dem Befehl dir() durchsuchen:

import math
dir(math)

Wir werden alle Funktionen sehen, die im math modul enthalten sind, sowie seltsame Dinge namens __doc__, __file__, __name__. Jede Funktion in einem gut gemachten Modul hat eine __doc__, die erklärt, wie man sie benutzt. Zum Beispiel sehen wir, dass es eine sin() Funktion innerhalb des Mathematikmoduls gibt. Möchtest Du wissen, wie man sie benutzt?

print(math.sin.__doc__)

Es mag nicht offensichtlich sein, aber auf beiden Seiten von doc sind zwei Unterstreichungszeichen.

Und zum Schluss noch ein letzter Tipp: Bei der Arbeit an neuem oder bestehendem Code ist es besser, nicht die FreeCAD Makro Dateierweiterung .FCMacro zu verwenden, sondern stattdessen die Standard Erweiterung .py. Der Grund dafür ist, dass Python die Erweiterung .FCMacro nicht kennt. Wenn du .py verwendest, kann dein Code einfach mit import geladen werden, wie wir bereits gesehen haben, und auch mit importlib.reload() neu geladen werden:

import importlib
importlib.reload(myTest)

Es gibt jedoch eine Alternative:

exec(open("C:/PathToMyMacro/myMacro.FCMacro").read())

Anfang

Loslegen mit FreeCAD

Hoffentlich hast du nun eine gute Vorstellung davon, wie Python funktioniert, und du kannst damit beginnen, zu erkunden, was FreeCAD zu bieten hat. Die Python Funktionen von FreeCAD sind alle gut in verschiedenen Modulen organisiert. Einige von ihnen sind bereits geladen (importiert), wenn du FreeCAD startest. Probiere einfach:

dir()

Anfang

Hinweise

  • FreeCAD wurde ursprünglich für die Arbeit mit Python 2 entwickelt. Da Python 2 im Jahr 2020 das Ende seiner Lebensdauer erreicht hat, wird die zukünftige Entwicklung von FreeCAD ausschließlich mit Python 3 erfolgen, und Rückwärtskompatibilität wird nicht unterstützt.
  • Viele weitere Informationen über Python findest du im offiziellen Python Tutorium und in der offiziellen Python Referenz.

Anfang