Introduction to Python/de

Dies ist eine kurze Anleitung für alle, die jetzt zum ersten Mal von Python hören. 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:


 * Es wurde speziell so erstellt, dass Menschen es einfach lesen können, und so ist es sehr einfach zu erlernen und zu verstehen.
 * 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.

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.

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.

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 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. Aber FreeCAD bietet auch einen Python-Interpreter in seinem unteren Teil:



(Falls bei Ihnen nicht angezeigt, klicken Sie auf: Ansicht → Ansichten → Python-Konsole.)

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:

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:

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.

Der Python-Interpreter hat auch ein eingebautes Hilfesystem. Schreiben Sie mal:

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" :

Jetzt erhalten Sie eine lange und vollständige Beschreibung dessen, was der Befehl print alles tun kann.

Und da wir jetzt völlig unseren Interpreter beherrschen, können wir mit dem ernsten Zeug beginnen.

Variablen
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:

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:

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:

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:

Wir änderten den Wert von myVariable. Wir können auch Variablen kopieren:

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.

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.

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.

Wir können immer den Datentyp einer Variablen überprüfen, mit dem speziellen Python-Schlüsselwort: type

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:

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:

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:

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

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:

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:

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:

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

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,

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:

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.

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 [ ]:

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:

oder ein einzelnes Element aus der Liste abrufen:

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. hier nachlesen kann, beispielsweise Inhalte sortieren, oder Elemente hinzufügen oder entfernen.

Ein lustiger und interessanter Hinweis für Sie: Ein Text-String hat sehr viel gemeinsam mit einer Liste von Buchstaben! Versuchen Sie das mal:

Üblicherweise kann man alles, was man mit Listen tun kann, auch auf Strings anwenden. Denn tatsächlich sind Listen und Strings eigentlich Sequenzen.

Außer Strings, Ints, Floats und Listen, gibt es noch weitere eingebaute Datentypen, wie z.B. Wörterbücher, oder Sie können auch Ihre eigenen Datentypen erstellen durch verwenden von Klassen.

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:

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.

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.

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.

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:

(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 Sie in den Interpreter help(range) eintippen, würden Sie sehen:

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

Oder komplexere Dinge wie diese:

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:

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:

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

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

Funktionen
Es gibt nur wenige 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:

(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.

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:

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:

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

will print the result on the screen, but outside the interpreter, since there is no print command inside the function, nothing would appear on the screen. You would need to:

to have something printed. Read more about functions here.

Modules
Now that we have a good idea of how Python works, we'll need one last thing: How to work with files and modules.

Until now, we wrote Python instructions line by line in the interpreter, right? What if we could write several lines together, and have them executed all at once? It would certainly be handier for doing more complex things. And we could save our work too. Well, that too, is extremely easy. Simply open a text editor (such as the windows notepad, Linux gedit, emacs, or vi), and write all your Python lines, the same way as you write them in the interpreter, with indentations, etc. Then, save that file somewhere, preferably with a .py extension. That's it, you have a complete Python program. Of course, there are much better editors than notepad, but it is just to show you that a Python program is nothing else than a text file.

To make Python execute that program, there are hundreds of ways. In windows, simply right-click your file, open it with Python, and execute it. But you can also execute it from the Python interpreter itself. For this, the interpreter must know where your .py program is. In FreeCAD, the easiest way is to place your program in a place that FreeCAD's Python interpreter knows by default, such as FreeCAD's bin folder, or any of the Mod folders. (In Linux, you probably have a directory /home/ /.FreeCAD/Mod, let's add a subdirectory to that called scripts where we will put the text file.) Suppose we write a file like this:

and we save it as myTest.py in our FreeCAD/bin directory (or on Linux to /home/ /.FreeCAD/Mod/scripts.) Now, let's start FreeCAD, and in the interpreter window, write:

without the .py extension. This will simply execute the contents of the file, line by line, just as if we had written it in the interpreter. The sum function will be created, and the message will be printed. There is one big difference: the import command is made not only to execute programs written in files, like ours, but also to load the functions inside, so they become available in the interpreter. Files containing functions, like ours, are called modules.

Normally when we write a sum function in the interpreter, we execute it simply like that:

Like we did earlier. When we import a module containing our sum function, the syntax is a bit different. We do:

That is, the module is imported as a "container", and all its functions are inside. This is extremely useful, because we can import a lot of modules, and keep everything well organized. So, basically, everywhere you see something.somethingElse, with a dot in between, that means somethingElse is inside something.

We can also import our sum function directly into the main interpreter space, like this:

Basically all modules behave like that. You import a module, then you can use its functions: module.function(argument). Almost all modules do that: they define functions, new data types and classes that you can use in the interpreter or in your own Python modules, because nothing prevents you from importing other modules inside your module!

One last extremely useful thing. How do we know what modules we have, what functions are inside and how to use them (that is, what kind of arguments they need)? We saw already that Python has a help function. Doing:

Will give us a list of all available modules. We can now type q to get out of the interactive help, and import any of them. We can even browse their content with the dir command

We'll see all the functions contained in the math module, as well as strange stuff named __doc__, __file__, __name__. The __doc__ is extremely useful, it is a documentation text. Every function of (well-made) modules has a __doc__ that explains how to use it. For example, we see that there is a sin function in side the math module. Want to know how to use it?

(It may not be evident, but on either side of doc are two underscore characters.)

And finally one last little goodie: When we work on a new or existing module, it's best to replace the file extension with py such as: myModule.FCMacro => myModule.py. We often want to test it so we will load it as above.

But what if we see that myTestFunction doesn't work correctly? We go back to our editor and make changes. Then, instead of closing and reopening the python interpreter, we can simply update the module like this:

This file renaming is because Python doesn't know about the extension FCMacro.

However, there are two alternates: Inside the one macro use Python's exec or execfile functions.

or

To share code across macros, you can access the FreeCAD or FreeCADGui module (or any other Python module) and set any attribute to it. This should survive the execution of the macro.

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

und lesen Sie auf FreeCAD Scripting Grundkenntnisse ...

Natürlich sahen wir hier nur einen sehr kleinen Teil der Python-Welt. Es gibt viele wichtige Vorstellungen, die wir hier nicht erwähnten. Es gibt zwei sehr wichtige Python-Bezugsdokumente im Netz: Vieleicht wollen Sie ja Lesezeichen dazu anlegen...?
 * die official Python reference
 * die Deutsche Seite mit Links zu Python