Zum Inhalt springen

Python (Programmiersprache)

Dies ist ein als exzellent ausgezeichneter Artikel.
Diese Seite befindet sich derzeit im Review-Prozess
aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 20. September 2004 um 19:27 Uhr durch 138.232.24.121 (Diskussion) (Literatur). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Python ist eine plattformunabhängige, interpretierte und objektorientierte Programmiersprache. Sie wurde Anfang der 90er Jahre von Guido van Rossum am Centrum voor Wiskunde en Informatica in Amsterdam entwickelt, ursprünglich für das verteilte Betriebssystem Amoeba. Den Namen erhielt die Sprache nach der englischen Comedy-Truppe Monty Python.

Ziele

Python wurde mit dem Ziel entworfen möglichst einfach und übersichtlich zu sein. Dies wird durch zwei Dinge erreicht: Zum einen enthält die Sprache einen sehr mächtigen Funktionsumfang in nur wenigen Schlüsselwörtern, zum anderen wurde die grammatische Syntax reduziert und auf Übersichtlichkeit optimiert. Dies führt dazu, dass Python eine Sprache ist, in der man schnell, einfach und leicht programmieren kann. Sie ist daher besonders da geeignet, wo Übersichtlichkeit und Lesbarkeit des Codes eine herausragende Rolle spielen - z.B. in der Teamarbeit, wenn man sich Code nach längerer Zeit wieder anschaut, oder bei Anfängern des Programmierens.

Durch die Möglichkeit, Programme auch anderer Sprachen als Modul einzubetten, werden viele Nischen in der Programmierung abgedeckt. Bei Bedarf lassen sich schnellere Routinen maschinennah programmieren, oder Python kann als Script-Sprache eines anderen Programmes dienen (Beispiele: OpenOffice und Gimp ).

Python ist eine Sprache, die den Programmierer nicht zu einem einzigen bestimmten Programmierstil zwingt. Unterstützt werden sowohl objektorientierte und strukturierte als auch funktionale Programmierung. Die Datentypen werden dynamisch verwaltet; eine statische Typprüfung (wie z.B. bei C++) gibt es nicht. Die Verwaltung frei gewordenen Speicherplatzes erfolgt automatisch durch so genannte Garbage collection.

Im Vergleich mit der Programmiersprache Perl fällt bei Python besonders auf, dass die Syntax möglichst einfach und damit besser les- und wartbar gestaltet wurde. Obwohl Python als "Skriptsprache" die Einfachheit betont, sind damit eine Reihe großer Softwareprojekte bewältigt worden. Ein Beispiel ist der Zope-Application Server sowie das Dateisystem Mojo Nation.

Datentypen und Strukturen

Python besitzt eine größere Anzahl von grundlegenden Datentypen. Neben der herkömmlichen Ganzzahl- und Fließkommaarithmetik unterstützt es transparent auch beliebig große Ganzzahlen und komplexe Zahlen.

Es verfügt über den üblichen Zierrat an Zeichenkettenoperationen, allerdings mit einer Besonderheit: Zeichenketten sind in Python unveränderliche Objekte. Damit führen Operationen, die das Ändern einer Zeichenkette bewerkstelligen sollen - wie z.B. die Ersetzung von Zeichen - dazu, dass stattdessen eine neue Zeichenkette zurückgegeben wird.

In Python ist der Datentyp an den Wert gebunden und nicht an eine Variable, d.h. Datentypen werden dynamisch vergeben, so wie bei LISP - und nicht wie bei Java. Alle Werte werden per Referenz übergeben.

Trotz der dynamischen Typverwaltung enthält Python eine gewisse Typprüfung. Diese ist strenger als bei Perl, aber weniger strikt als bei Objective CAML. Implizite Umwandlungen sind für numerische Typen definiert, so dass man beispielsweise eine komplexe Zahl mit einer langen Ganzzahl ohne explizite Typumwandlung multiplizieren kann. Anders als bei Perl allerdings gibt es keine implizite Umwandlung zwischen Zahlen und Zeichenketten; in Operationen für Zeichenketten kann also anstelle einer Zeichenkette nicht direkt eine Zahl verwendet werden.

Sammeltypen

Python besitzt mehrere Sammeltypen, darunter Listen, Tupel und Wörterbücher. Listen, Tupel und Zeichenketten sind Folgen (Sequenzen) und kennen fast alle die gleichen Methoden: Über die Zeichen einer Kette kann man ebenso iterieren wie über die Elemente einer Liste. Listen sind erweiterbare Felder (Arrays), wohingegen Tupel eine feste Länge haben und unveränderbar sind.

Der Zweck solcher Unveränderbarkeit hängt mit den Wörterbüchern (Dictionaries) zusammen, ein Datentyp, der auch als Hashtabelle oder assoziatives Array bezeichnet wird. Um auch unter den Bedingungen der Übergabe per Referenz die Datenkonsistenz zu sichern, müssen die Schlüssel eines Wörterbuches vom Typ "unveränderbar" sein. Die ins Wörterbuch eingetragenen Werte können dagegen von beliebigem Typ sein.

Objektsystem

Das Typsystem von Python ist auf das Klassensystem abgestimmt. Obwohl die eingebauten Datentypen genau genommen nicht eigentlich Klassen sind, können Klassen von einem Typ erben. So kann man die Eigenschaften von Zeichenketten oder Wörterbüchern erweitern - und sogar auch von Ganzzahlen, falls man das möchte. Python unterstützt auch Mehrfachvererbung.

Die Sprache unterstützt direkt den Umgang mit Typen und Klassen. Typen können ausgelesen (ermittelt) und verglichen werden - in Wirklichkeit sind die Typen (wie in Smalltalk) selbst ein Typ. Die Attribute eines Objektes können als Wörterbuch extrahiert werden.

Syntax

Python wurde so entworfen, dass es gut lesbar ist. Die Anweisungen sind übersichtlich anzuordnen, benutzen häufig englische Schlüsselwörter, wo andere Sprachen Interpunktionszeichen verwenden und dazu besitzt Python spürbar weniger syntaktische Konstruktionen als viele strukturierte Sprachen wie C, Perl oder Pascal.

Z.B. kennt Python nur zwei Schleifenformen - for zur Iteration über die Elemente einer Liste und while zur Wiederholung einer Schleife so lange, wie ein logischer Ausdruck wahr ist. Es hat also weder das verwickelte for oder das do...while von C, noch Perls until, obwohl die entsprechenden Äquivalente natürlich ausgedrückt werden können. Und genau so hat es für Verzweigungen auch nur die Konstruktion if...elif...else und kein switch oder goto zu Sprungzielen.

Die Sache mit den Leerzeichen

Am ehesten ungewohnt an der Python-Syntax ist die Art und Weise, wie die Grenzen von Blockstrukturen gekennzeichnet werden. Viele Programmierer, die noch nie eine Zeile Python-Code geschrieben haben, kennen diese "Sache mit den Leerzeichen" vom Hörensagen, weil das ein deutlicher Unterschied zu herkömmlichen Sprachen ist.

Blockstrukturen, wie sie ursprünglich aus ALGOL stammen, werden z.B. in Sprachen wie Pascal, C und Perl benutzt, wobei die Blockgrenzen durch Klammern oder Schlüsselworte markiert werden (C und Perl benutzen beispielsweise { }; Pascal benutzt begin und end ). In all diesen Sprachen gibt es dazu noch die Sitte, einen Block durch eine Einrückung zu kennzeichnen, damit er optisch von der Umgebung abgesetzt ist, die nicht zum Block gehört.

Python dagegen nimmt eine Anleihe bei der weniger bekannten Programmiersprache Occam auf - anstatt Satzzeichen oder Schlüsselworten benutzt es die Einrückungen selbst, um den Verlauf eines Blockes zu kennzeichnen. Ein kurzes Beispiel macht das schnell klar. Hier sind Funktionen in C und in Python, die das gleiche tun - die Fakultät einer Ganzzahl berechnen:

C:

int factorial(int x) {
    if (x == 0) {
        return(1);
    } else {
        return(x * factorial(x - 1));
    }
}

Python:

def factorial(x):
    if x == 0:
        return 1
    else:
        return x * factorial(x - 1)

Manche Programmierer, die von ALGOL-beeinflussten Sprachen (unter anderen C, Pascal) her gewohnt sind, dass Leerzeichen keine Bedeutung haben, sind dadurch anfänglich etwas irritiert. Es wurden auch schon Vergleiche zum Lochkarten-Format von Fortran gezogen: Die Formatfreiheit von Programmiersprachen galt einmal als Fortschritt, weil endlich das Symbol selbst die entscheidende Rolle spielte und nicht seine Position in der Zeile.

Für Python-Programmierer dagegen ist "die Sache mit den Leerzeichen" einfach eine Weiterführung des Einrückungs-Brauchs, dem ALGOL-Programmierer ohnehin immer gefolgt sind.

Ein Problem kann sich daraus ergeben: Wird ein Editor benutzt, der Tabulator-Zeichen in der Datei abspeichert, so kann eine Einrückung entstehen, die nicht der Blockstruktur entspricht, wenn in der selben Datei Einrückungen mit einfachen Leerzeichen vorkommen, da der Python-Interpreter davon ausgeht, dass ein Tabulator-Zeichen genau acht Leerzeichen entspricht, auch wenn in der Datei z.B. mit vier einfachen Leerzeichen eingerückt wird.

Daher sollte man darauf achten, die Einrückungen in der gesamten Datei gleich zu gestalten. Es ist ratsam, ganz auf Tabulator-Zeichen zu verzichten, zumal die meisten Editoren so konfiguriert werden können, dass sie anstelle eines Tabulator-Zeichens eine definierte Anzahl Leerzeichen schreiben.

Funktionales Programmieren

Erwähnt wurde bereits, dass Python auch über ausdrucksstarke syntaktische Elemente zur funktionalen Programmierung verfügt. Wie schon zu vermuten war, vereinfachen diese das Arbeiten mit Listen und anderen Sammeltypen. Eine solche Konstruktion ist die Listennotation, die aus der funktionalen Programmiersprache Haskell stammt; hier bei der Berechnung der ersten fünf Zweierpotenzen:

zahlen = [1, 2, 3, 4, 5]
hoch_zwei = [ 2 ** n for n in zahlen ]

Weil in Python Funktionen als Argumente auftreten dürfen, kann man auch ausgeklügeltere Konstruktionen ausdrücken, wie z.B. die Fortsetzungstechnik ("Continuation semantics").


Pythons Schlüsselwort lambda könnte manche Anhänger der funktionalen Programmierung fehlleiten. Solche lambda -Blöcke in Python können nur Ausdrücke enthalten, aber keine Anweisungen. Damit sind sie nicht der allgemeinst mögliche Weg, um eine Funktion zurückzugeben. Die übliche Vorgehensweise ist stattdessen, eine Funktion einfach so zurückzugeben, indem man einen lokalen Namen benutzt, wie im folgenden Beispiel einer einfachen Funktion nach den Ideen von Haskell Brooks Curry:

def add_and_print_maker(x):
    def temp(y):
        print "%d + %d = %d" % (x, y, x+y)
    return temp

Ausnahmebehandlung

Python unterstützt (und nutzt ausgiebig) die Ausnahmebehandlung als ein Mittel, um Fehlerbedingungen zu testen. Dies ist so weit in Python integriert, dass es sogar möglich ist, Syntaxfehler abzufangen.

Ausnahmen erlauben einen bündigeren Fehlertest mit mehr Sicherheit als viele andere Verfahren, mit denen man Fehler oder Ausnahmezustände mitteilen kann. Ausnahmen sind Thread-sicher, sie führen nicht dazu, den Code durch den Test von Rückgabewerten zu verunstalten, wie das in C geschieht; und sie können sich leicht entlang der Aufruffolge hangeln, falls ein Fehler an eine höhere Programmebene gemeldet werden soll.

Der Python-Stil ermutigt zum Einsatz von Ausnahmen, wann immer eine Fehlerbedingung entstehen könnte. Es ist tatsächlich so, dass es in Python z.B. anstelle eines vorherigen Dateitestes auf Beschreibbarkeit üblich ist, die Schreibfunktion einfach auszuprobieren und eine eventuelle Ausnahme abzufangen - falls der Zugriff verwehrt wird.

Außerdem nützlich ist dieses Prinzip bei der Konstruktion benutzersicherer Eingabeaufforderungen:

while True:
  try:
    num = raw_input("Eine Zahl eingeben: ")
    num = int(num)
    break
  except ValueError:
    print "Eine _Zahl_, bitte!"

Dieser Code wird den Benutzer so lange nach einer Nummer fragen, bis dieser einen String eingibt, der sich per int() in eine Ganzzahl konvertieren lässt, ohne dass ein Fehler auftritt.

Standardbibliothek

Python verfügt über eine große Standardbibliothek, wodurch es sich für viele Anwendungen gut eignet. Die Module der Standardbibliothek können mit in C oder Python selbst geschriebenen Modulen ergänzt werden. Die Standardbibliothek ist besonders auf Internet-Anwendungen zugeschnitten, mit der Unterstützung einer großen Anzahl von Standardformaten und -Protokollen (wie MIME und HTTP). Module zur Schaffung grafischer Schnittstellen, zur Verbindung mit relationalen Datenbanken und zur Manipulation regulärer Ausdrücke sind ebenfalls enthalten.

Die Standardbibliothek ist eine der größten Stärken von Python. Das meiste davon ist plattformunabhängig, so dass auch größere Python-Programme oft auf Unix, Windows, Macintosh und anderen Plattformen ohne Änderung laufen.

Mit Hilfe des mitgelieferten Moduls Tkinter kann in Python (wie in Perl und Tcl) schnell eine grafische Oberfläche (GUI) mit Tk erzeugt werden. Es gibt eine Vielzahl anderer GUI-Bibliotheken, unter denen wxPython und PyQt am ausgereiftesten sind.

Sonstiges

So wie LISP - und Perl im Debugger - unterstützt der Python-Interpreter auch einen interaktiven Modus, in dem Ausdrücke am Terminal eingegeben und die Ergebnisse sofort betrachtet werden können. Das ist nicht nur für Neulinge angenehm, die die Sprache lernen, sondern genauso auch für erfahrene Programmierer: Code-Stückchen können interaktiv ausgiebig getestet werden, bevor man sie in ein geeignetes Programm aufnimmt.

Python ist für die meisten gängigen Betriebssysteme frei erhältlich und ist eine der drei Sprachen, die häufig in einer LAMP-Umgebung eingesetzt werden.

Literatur

Foren

Mailinglisten

Newsgroups

IRC Channels

  • #python im euIRCnet-Netzwerk (deutsch/englisch)
  • #python.de im Freenode-Netzwerk (deutsch)
  • #python im Freenode-Netzwerk (englisch)

Sonstiges

tokipona:toki pali pi akesi linja