Python (Programmiersprache)
Python ist eine interpretierte, interaktive Programmiersprache.
Sie wurde von Guido van Rossum am Stichting Mathematisch Centrum in Holland entwickelt.
Den Namen erhielt die Sprache nach der englischen Comedy-Truppe Monty Python.
Oft wird Python mit Programmiersprachen wie Tcl, Perl, Scheme und Java, neuerdings auch Ruby, verglichen.
Philosophie
Python ist eine Sprache, die ganz unterschiedliche Vorgehensweisen (Paradigmen) gleichermaßen unterstützt, so ähnlich wie auch C++ das tut, Smalltalk aber nicht. Das heißt, der Programmierer wird nicht zu einem einzigen bestimmten Programmierstil gezwungen. 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 also nicht. Die Verwaltung frei gewordenen Speicherplatzes (Garbage collection) erfolgt automatisch.
Obwohl bei der Werbung für Python oft die Gegenüberstellung zu Perl benutzt wurde, gibt es zwischen beiden Sprachen viele Gemeinsamkeiten. Allerdings lehnen die Entwerfer von Python Perls ausführliche Syntax ab und formulieren sparsamer und damit besser lesbar (wie sie behaupten). Obwohl Python (ebenso wie Perl) manchmal als "Skriptsprache" bezeichnet wird, sind damit schon eine Reihe großer Softwareprojekte bewältigt worden, z.B. der Zope Application Server und das Mojo Nation Dateisystem.
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 Hashliste oder assoziatives Feld 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üsselworte, 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-ähnlichen Sprachen her gewohnt sind, dass Leerzeichen keine Bedeutung haben, sind dadurch anfänglich etwas irritiert. Es wurden auch schon unverhohlen 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.
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"; http://www.ps.uni-sb.de/~duchier/python/continuations.html ).
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 B. 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. Man kann sogar die Ausnahmemeldungen abfangen, die von Syntaxfehlern herrühren!
Ausnahmen erlauben einen bündigeren Fehlertest mit mehr Sicherheit als viele andere Verfahren, mit denen man Fehler oder Ausnahmezustände mitteilen kann. Ausnahmen sind Strang-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.
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.
Sonstiges
So wie LISP - und anders als Perl - 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 unterschiedliche Betriebssysteme frei erhältlich
Weblinks
- http://www.python.org/
- http://www.way2python.de/
- Das Python Tutorium
- Python Wiki (englisch), Python Wiki (deutsch)