Dieser Artikel existiert auch als Audiodatei.
Dies ist ein als lesenswert ausgezeichneter Artikel.

„Python (Programmiersprache)“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
[gesichtete Version][ungesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
Keine Bearbeitungszusammenfassung
Zeile 2: Zeile 2:
|Name = Python
|Name = Python
|Logo = [[Datei:Python logo.svg|230px]]
|Logo = [[Datei:Python logo.svg|230px]]
|Paradigma = multiparadigmatisch
|Paradigma = multiparadigmatisc
|Erscheinungsjahr = 1991
|Erscheinungsjahr = 1991
|Entwickler = Python Software Foundation
|AktuelleVersion = 3.3.0 &nbsp;(29.&nbsp;September 2012)<br />2.7.3
|AktuelleVersionFreigabeDatum = 11.&nbsp;April 2012
|Typisierung = [[Starke Typisierung|stark]], [[Dynamische Typisierung|dynamisch]] („[[Duck-Typing]]“)
|Implementierung = [[CPython]], [[Jython]], [[IronPython]], [[PyPy]]
|Beeinflusst_von = ABC, [[Algol 60]], [[Modula-3]], Icon, [[C (Programmiersprache)|C]], [[Perl (Programmiersprache)|Perl]], [[LISP]], [[Smalltalk (Programmiersprache)|Smalltalk]], [[Tcl]], [[Haskell (Programmiersprache)|Haskell]]
|Beeinflusste = [[Ruby (Programmiersprache)|Ruby]], [[Boo (Programmiersprache)|Boo]], [[Groovy]], [[Cython]]
|Lizenz = [[Python Software Foundation#Python Software Foundation Lizenz|Python Software Foundation Lizenz]]<ref>[http://www.python.org/psf/license/ Python License]</ref>
|Website = [http://www.python.org/ www.python.org]
}}

'''Python''' [{{IPA|ˈpaɪθn̩}}, {{IPA|ˈpaɪθɒn}}, {{IPA|ˈpyːtɔn}}] ist eine universelle, üblicherweise interpretierte [[höhere Programmiersprache]].<ref>{{cite web |url= http://www.python.org/doc/faq/general/#what-is-python-good-for|title= What is Python Good For?|accessdate=2008-09-05 |work= General Python FAQ|publisher= Python Foundation}}</ref> Ihre Entwurfsphilosophie betont Programmlesbarkeit.<ref>{{cite web | url = http://www.python.org/doc/essays/blurb/ | title = What is Python? Executive Summary | publisher = Python Foundation | work = Python documentation | accessdate = 2007-03-21 }}</ref> Von den meisten verbreiteten Programmiersprachen unterscheidet sie sich dadurch, dass Blöcke durch gleiche Einrückung begrenzt werden, und nicht durch Klammern ([[C (Programmiersprache)|C]], [[C++]]) oder Schlüsselwörter ([[Pascal (Programmiersprache)|Pascal]]).

Python unterstützt mehrere [[Programmierparadigma|Programmierparadigmen]]. So werden [[Objektorientierte Programmierung|objektorientierte]], [[Aspektorientierte Programmierung|aspektorientierte]] und [[Funktionale Programmierung|funktionale]] Programmierung unterstützt. Wie andere [[Dynamische Programmiersprache|dynamische]] Sprachen wird Python oft als [[Skriptsprache]] genutzt.

Die Sprache hat ein offenes, gemeinschaftsbasiertes Entwicklungsmodell, gestützt durch die gemeinnützige [[Python Software Foundation]], die ''[[de facto]]'' die Definition der Sprache in der Referenzumsetzung [[CPython]] pflegt.

Python gilt als einfach zu erlernende Sprache ([[Lernkurve]]), da sie über eine klare und übersichtliche Syntax verfügt.

== Entwicklungsgeschichte ==

[[Bild:Guido van Rossum.jpg|thumb|Guido van Rossum 2006]]
Die Sprache wurde Anfang der 1990er Jahre von [[Guido van Rossum]] am ''[[Centrum Wiskunde & Informatica]]'' in [[Amsterdam]] als Nachfolger für die Programmier-Lehrsprache ''ABC'' entwickelt und war ursprünglich für das verteilte [[Betriebssystem]] [[Amoeba (Betriebssystem)|Amoeba]] gedacht.

== Namensherkunft ==
Der Name geht nicht etwa (wie das Logo vermuten ließe) auf die gleichnamige Schlangengattung ([[Pythons]]) zurück, sondern bezog sich ursprünglich auf die englische Komikertruppe [[Monty Python]]. In der Dokumentation finden sich daher auch einige Anspielungen auf Sketche aus dem [[Monty Python’s Flying Circus|Flying Circus]].<ref>[http://www.python.org/doc/faq/general/#why-is-it-called-python Offizielle Python FAQ], sowie [http://docs.python.org/tut/node3.html Python Tutorial, Kapitel 1]</ref> Trotzdem etablierte sich die [[Assoziation (Psychologie)|Assoziation]] zur Schlange, was sich unter anderem in der Programmiersprache [[Cobra (Programmiersprache)|Cobra]]<ref>[http://cobra-language.com/ Cobra]</ref> sowie dem Python-Toolkit „Boa“<ref>http://boa-constructor.sourceforge.net</ref> äußert.
Der Name geht nicht etwa (wie das Logo vermuten ließe) auf die gleichnamige Schlangengattung ([[Pythons]]) zurück, sondern bezog sich ursprünglich auf die englische Komikertruppe [[Monty Python]]. In der Dokumentation finden sich daher auch einige Anspielungen auf Sketche aus dem [[Monty Python’s Flying Circus|Flying Circus]].<ref>[http://www.python.org/doc/faq/general/#why-is-it-called-python Offizielle Python FAQ], sowie [http://docs.python.org/tut/node3.html Python Tutorial, Kapitel 1]</ref> Trotzdem etablierte sich die [[Assoziation (Psychologie)|Assoziation]] zur Schlange, was sich unter anderem in der Programmiersprache [[Cobra (Programmiersprache)|Cobra]]<ref>[http://cobra-language.com/ Cobra]</ref> sowie dem Python-Toolkit „Boa“<ref>http://boa-constructor.sourceforge.net</ref> äußert.


Zeile 55: Zeile 30:


=== Sammeltypen ===
=== Sammeltypen ===
Python besitzt mehrere ''Sammeltypen'', darunter [[Liste (Datenstruktur)|Listen]], [[Tupel (Informatik)|Tupel]], [[Menge (Datenstruktur)|Mengen]] (Sets) und [[Assoziatives Array|assoziative Arrays]]. Listen, Tupel und Zeichenketten sind ''Folgen'' (Sequenzen, [[Feld (Datentyp)|Arrays]]) und kennen fast alle die gleichen Methoden: Über die Zeichen einer Kette kann man ebenso [[Iteration|iterieren]] wie über die Elemente einer Liste. Außerdem gibt es die unveränderlichen Objekte, die nach ihrer Erzeugung nicht mehr geändert werden können. Listen sind z.&nbsp;B. erweiterbare Felder (Arrays), wohingegen Tupel und Zeichenketten eine feste Länge haben und unveränderlich sind.
Python besitzt mehrere ''Sammeltypen'', darunter [[Liste (Datenstruktur)|Listen]], [[Tupel (Informatik)|Tupel]], [[Menge (Datenstruktur)|Mengen]] (Sets) und [[Assoziatives Array|assoziative Arrays]]. Listen, Tupel und Zeichenketten sind ''Folgen'' (Sequenzen, [[Feld (Datentyp)|Arrays]]) und kennen fast alle die glen z
Anonyme Namensräume (sog. [[C

* Bei der Definition (aber ni]] benutzen. (Diese Beschränkung existiert unter [[Jython]] oder [[IronPython]] nicht.) Es ist nicht geplant, den GIL zu ersetzen. Stattdessen wird empfohlen, statt Threads mehrere miteinander kommunizierende Prozesse zu verwenden.<ref>http://www.python.org/doc/faq/library/#can-t-we-get-rid-of-the-global-interpreter-lock</ref><ref>http://www.artima.com/weblogs/viewpost.jsp?thread=214235</ref>
Der Zweck solcher Unveränderlichkeit hängt z.&nbsp;B. mit den ''Wörterbüchern'' zusammen, einem Datentyp, der auch als ''[[assoziatives Array]]'' bezeichnet wird. Um die Datenkonsistenz zu sichern, müssen die ''Schlüssel'' eines Wörterbuches vom Typ „unveränderlich“ sein. Die ins Wörterbuch eingetragenen ''Werte'' können dagegen von beliebigem Typ sein.

''Sets'' sind Mengen von Objekten und in CPython ab Version 2.4 im Standardsprachumfang enthalten. Diese Datenstruktur kann beliebige (paarweise unterschiedliche) Objekte aufnehmen und stellt Mengenoperationen wie beispielsweise [[Menge (Mathematik)#Durchschnitt (Schnittmenge, Schnitt)|Durchschnitt]], [[Mengenlehre#Differenz und Komplement|Differenz]] und [[Menge (Mathematik)#Vereinigung (Vereinigungsmenge, „Summe“)|Vereinigung]] zur Verfügung.

=== Objektsystem ===
Das [[Typsystem]] von Python ist auf das Klassensystem abgestimmt. Obwohl die eingebauten Datentypen genau genommen keine [[Klasse (Programmierung)|Klassen]] sind, können Klassen von einem Typ [[Vererbung (Programmierung)|erben]]. So kann man die Eigenschaften von Zeichenketten oder Wörterbüchern erweitern – auch von Ganzzahlen. Python unterstützt [[Mehrfachvererbung]].

Die Sprache unterstützt direkt den Umgang mit Typen und Klassen. Typen können ausgelesen (ermittelt) und verglichen werden und verhalten sich wie Objekte – in Wirklichkeit sind die Typen (wie in [[Smalltalk (Programmiersprache)|Smalltalk]]) selbst ein Objekt. Die Attribute eines Objektes können als Wörterbuch extrahiert werden.

== Syntax ==
Eines der Entwurfsziele für Python war die gute Lesbarkeit des Quellcodes.
Die Anweisungen benutzen häufig englische Schlüsselwörter, wo andere Sprachen Symbole einsetzen.
Darüber hinaus besitzt Python weniger syntaktische Konstruktionen als viele andere strukturierte Sprachen wie [[C (Programmiersprache)|C]], [[Perl (Programmiersprache)|Perl]] oder [[Pascal (Programmiersprache)|Pascal]]:
<div style="border: 1px solid; margin:1em; padding:1ex;">
* zwei Schleifenformen
** <code>for</code> zur Iteration über die Elemente einer Sequenz
** <code>while</code> zur Wiederholung einer Schleife, solange ein logischer Ausdruck wahr ist.
* Verzweigungen
** <code>if … elif … else</code> für Verzweigungen
</div>
Beim letzten Punkt bieten andere Programmiersprachen zusätzlich <code>switch</code> und/oder <code>goto</code>. Diese wurden zugunsten der Lesbarkeit in Python weggelassen und müssen durch <code>if</code>-Konstrukte oder andere Verzweigungsmöglichkeiten (Slices, Wörterbücher) abgebildet werden.

=== Strukturierung durch Einrücken ===
Python benutzt wie [[Miranda (Programmiersprache)|Miranda]] und [[Haskell (Programmiersprache)|Haskell]] [[Einrückungsstil|Einrückungen]] als Strukturierungselement. Diese Idee wurde erstmals von [[Peter J. Landin]] vorgeschlagen und von ihm [[off-side rule]] („Abseitsregel“) genannt. In den meisten anderen Programmiersprachen werden Blöcke durch Klammern oder Schlüsselwörter markiert, während verschieden große [[Leerraum|Leerräume]] außerhalb von Zeichenketten keine spezielle Semantik tragen. Bei diesen Sprachen ist die Einrückung zur optischen Hervorhebung eines Blockes zwar erlaubt und in der Regel auch erwünscht, aber nicht vorgeschrieben. Für Programmierneulinge wird der Zwang zu lesbarem Stil aber als Vorteil gesehen.

Hierzu als Beispiel die Berechnung der [[Fakultät (Mathematik)|Fakultät]] einer Ganzzahl, einmal in [[C (Programmiersprache)|C]] und einmal in Python:

Fakultätsfunktion in C (mit Einrückung):
<syntaxhighlight lang="c">
int fakultaet(int x) {
if (x > 1) {
return x * fakultaet(x - 1);
} else {
return 1;
}
}
</syntaxhighlight>

Jetzt die gleiche Funktion in Python:
<syntaxhighlight lang="python">
def fakultaet(x):
if x > 1:
return x * fakultaet(x - 1)
else:
return 1
</syntaxhighlight>

Es ist jedoch darauf zu achten, die Einrückungen im gesamten Programmtext gleich zu gestalten. Die gemischte Verwendung von Leerzeichen und Tabulatorzeichen kann zu Problemen führen, da der Pythoninterpreter Tab-Stops im Abstand von acht Leerzeichen annimmt. Je nach Konfiguration des Editors können Tabulatoren optisch mit weniger als acht Leerzeichen dargestellt werden, was zu Syntaxfehlern oder ungewollter Programmstrukturierung führen kann. Als vorbeugende Maßnahme kann man den Editor Tabulatoren durch eine feste Anzahl von Leerzeichen ersetzen lassen. Die Python-Distribution enthält in der Standardbibliothek das Modul ''tabnanny'', welches die Vermischung von Tabulatoren und Leerzeichen zu erkennen und beheben hilft.

Man kann die Fakultätsfunktion aber auch wie in C in einer Zeile formulieren:

Die Fakultätsfunktion in C (ohne Einrückung):
<syntaxhighlight lang="c">
int fakultaet(int x) { return (x > 1) ? (x * fakultaet(x - 1)) : 1; }
</syntaxhighlight>

Die Fakultätsfunktion ohne Einrückung in Python:
<syntaxhighlight lang="python">
def fakultaet(x): return x * fakultaet(x - 1) if x > 1 else 1
</syntaxhighlight>

In diesem Fall endet in Python der "Block" (die Funktion) mit dem Zeilenende.

=== Funktionales Programmieren ===
Ausdrucksstarke syntaktische Elemente zur [[Funktionale Programmierung|funktionalen Programmierung]] vereinfachen das Arbeiten mit Listen und anderen Sammeltypen. Eine solche Vereinfachung ist die Listennotation, die aus der funktionalen Programmiersprache [[Haskell (Programmiersprache)|Haskell]] stammt; hier bei der Berechnung der ersten fünf Zweierpotenzen:
<syntaxhighlight lang="python">
zahlen = [1, 2, 3, 4, 5]
zweierpotenzen = [2 ** n for n in zahlen]
</syntaxhighlight>
Weil in Python Funktionen als Argumente auftreten dürfen, kann man auch ausgeklügeltere Konstruktionen ausdrücken, wie den [[Continuation-passing style]].

Pythons Schlüsselwort <code>lambda</code> könnte manche Anhänger der funktionalen Programmierung fehlleiten. Solche <code>lambda</code>-Blöcke in Python können nur Ausdrücke enthalten, aber keine Anweisungen. Damit sind sie nicht der allgemeinste Weg, um eine Funktion zurückzugeben. Die übliche Vorgehensweise ist stattdessen, den Namen einer lokalen Funktion zurückzugeben. Das folgende Beispiel zeigt dies anhand einer einfachen Funktion nach den Ideen von [[Haskell Brooks Curry]]:
<syntaxhighlight lang="python">
def add_and_print_maker(x):
def temp(y):
print("{} + {} = {}".format(x, y, x + y))
return temp
</syntaxhighlight>

Damit ist auch [[Currying]] auf einfache Art möglich, um generische Funktionsobjekte auf problemspezifische herunterzubrechen. Hier ein einfaches Beispiel:
<syntaxhighlight lang="python">
def curry(func, knownargument):
return lambda unknownargument: func(unknownargument, knownargument)
</syntaxhighlight>

Wird die <code>curry</code>-Funktion aufgerufen, erwartet diese eine Funktion mit zwei notwendigen Parametern sowie die Parameterbelegung für den zweiten Parameter dieser Funktion. Der Rückgabewert von <code>curry</code> ist eine Funktion, die dasselbe tut wie <code>func</code> aber nur noch einen Parameter benötigt.

Anonyme Namensräume (sog. [[Closure]]s) sind mit den o.&nbsp;g. Mechanismen in Python ebenfalls einfach möglich. Ein simples Beispiel für einen [[Stapelspeicher|Stack]], intern durch eine Liste repräsentiert:
<syntaxhighlight lang="python">
def stack():
l = []
def pop(): return l.pop()
def push(element): l.append(element)
def isempty(): return len(l) == 0
return pop, push, isempty

POP, PUSH, ISEMPTY = stack()
</syntaxhighlight>

Auf diese Weise erhält man die drei Funktionsobjekte <code>POP, PUSH, ISEMPTY</code>, um den Stack zu modifizieren bzw. auf enthaltene Elemente zu prüfen, ohne <code>l</code> direkt modifizieren zu können.

=== Ausnahmebehandlung ===
Python nutzt ausgiebig die [[Ausnahmebehandlung]] (engl. ''exception handling'') als ein Mittel, um Fehlerbedingungen zu testen. Dies ist so weit in Python integriert, dass es teilweise sogar möglich ist, [[Syntaxfehler]] abzufangen und zur Laufzeit zu behandeln.

Ausnahmen haben einige Vorteile gegenüber anderen beim Programmieren üblichen Verfahren der Fehlerbehandlung (wie z.&nbsp;B. Fehler-Rückgabewerte und globale Statusvariablen). Sie sind [[Thread (Informatik)|Thread]]-sicher und können leicht bis in die höchste Programmebene weitergegeben oder an einer beliebigen anderen Ebene der Funktionsaufruffolge behandelt werden. Der korrekte Einsatz von Ausnahmebehandlungen beim Zugriff auf dynamische Ressourcen erleichtert es zudem, bestimmte auf [[Race Condition]]s basierende Sicherheitslücken zu vermeiden, die entstehen können, wenn Zugriffe auf bereits veralteten Statusabfragen basieren.

Der Python-Ansatz legt den Einsatz von Ausnahmen nahe, wann immer eine Fehlerbedingung entstehen könnte. Nützlich ist dieses Prinzip beispielsweise bei der Konstruktion robuster Eingabeaufforderungen:
<syntaxhighlight lang="python">
while True:
try:
num = raw_input("Eine Zahl eingeben: ")
num = int(num)
break
except ValueError:
print("Eine _Zahl_, bitte!")
</syntaxhighlight>

Dieser Code wird den Benutzer so lange nach einer Nummer fragen, bis dieser eine Zeichenfolge eingibt, die sich per <code>int()</code> in eine Ganzzahl konvertieren lässt. Durch die Ausnahmebehandlung wird hier vermieden, dass eine Fehleingabe zu einem [[Laufzeitfehler]] führt, der das Programm zur Beendigung zwingt.

Ebenso kann auch das hier nicht berücksichtigte [[Interrupt]]-Signal (<code>SIGINT</code>, häufig Strg+C) mittels Ausnahmebehandlung in Python abgefangen und behandelt werden (<code>except KeyboardInterrupt: …</code>).

== Standardbibliothek ==
Python verfügt über eine große [[Standardbibliothek]], wodurch es sich für viele Anwendungen gut eignet.
Sie ist eine der größten Stärken von Python. Der überwiegende Teil davon ist plattformunabhängig, so dass auch größere Python-Programme oft auf Unix, Windows, Mac&nbsp;OS&nbsp;X und anderen Plattformen ohne Änderung laufen.
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 [[Multipurpose Internet Mail Extensions|MIME]] und [[Hypertext Transfer Protocol|HTTP]]). Module zur Schaffung grafischer Schnittstellen, zur Verbindung mit [[Relationale Datenbank|relationalen Datenbanken]] und zur Manipulation [[Regulärer Ausdruck|regulärer Ausdrücke]] sind ebenfalls enthalten.

Mit Hilfe des mitgelieferten Moduls [[Tkinter]] kann in Python (wie in [[Perl (Programmiersprache)|Perl]] und [[Tcl]]) schnell eine grafische Oberfläche ([[Grafische Benutzeroberfläche|GUI]]) mit [[Tk (Toolkit)|Tk]] erzeugt werden. Es gibt darüber hinaus eine Vielzahl von weiteren [[Wrapper (Software)|Wrappern]] von anderen Anbietern. Sie stellen Anbindungen ([[Englische Sprache|engl.]] ''language bindings'') zu GUI-Bibliotheken wie z.&nbsp;B. [[PyGTK]], [[PyQt]], Py<nowiki />[[K Desktop Environment|KDE]], [[wxPython]], [[PyObjC]] und Py[[FLTK]] zur Verfügung.

== Beispiel ==
Als nicht triviales Beispiel sei hier der [[Quicksort]]-Algorithmus angegeben:

<syntaxhighlight lang="python">
def quicksort(liste):
if len(liste) <= 1:
return liste
pivotelement = liste.pop()
links = [element for element in liste if element < pivotelement]
rechts = [element for element in liste if element >= pivotelement]
return quicksort(links) + [pivotelement] + quicksort(rechts)
</syntaxhighlight>

Hier ermöglicht insbesondere die Listennotation für die Variablen ''links'' und ''rechts'' eine kompakte Darstellung. Zum Vergleich eine imperative Formulierung dieser zwei Zeilen:
<syntaxhighlight lang="python">
...
links, rechts = [], [] # Leere Listen links und rechts
pivotelement = liste.pop() # Das letzte Element aus der Liste nehmen
for element in liste: # Die verkürzte Liste durchlaufen
if element < pivotelement:
links.append(element) # wenn < dann an linke Liste anhängen
else:
rechts.append(element) # wenn nicht < (also >=) dann an rechte Liste anhängen
...
</syntaxhighlight>

== Interaktive Benutzung ==
So wie [[LISP]], [[Ruby (Programmiersprache)|Ruby]], [[Groovy]] und [[Perl (Programmiersprache)|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, die die Sprache lernen, angenehm, sondern auch für erfahrene Programmierer: Code-Stückchen können interaktiv ausgiebig getestet werden, bevor man sie in ein geeignetes Programm aufnimmt.

Darüber hinaus steht mit Python Shell ein [[Kommandozeileninterpreter]] für verschiedene [[unixoid]]e [[Betriebssystem|Computer-Betriebssysteme]] zur Verfügung, der neben klassischen Unix-[[Kommandozeile|Shellkommandos]] auch direkte Eingaben in Python-Form verarbeiten kann.

== Implementierungen ==
* [[CPython]]
* [[PyPy]]
* [[Parrot]]
* [[Jython]] (für die [[Java Virtual Machine]])
* [[IronPython]] (für [[.NET]])
* [[Stackless Python]]

== Entwicklungsumgebung ==

Neben IDLE, das mit Python installiert wird und wenig mehr als eine Textumgebung und die Shell umfasst, existieren einige spezielle Entwicklungsumgebungen für Python, beispielsweise [[Eric Python IDE]]. Des Weiteren existieren Plugins für größere IDEs wie [[Eclipse (IDE)|Eclipse]] und [[NetBeans IDE|NetBeans]]. Texteditoren für Programmierer wie [[Vim]] und [[Emacs]] lassen sich gegebenenfalls auch für Python anpassen. Pythoncode und somit lauffähige Programme lassen sich grundsätzlich mit jedem Texteditor schreiben.

Für die verschiedenen GUI-Frameworks, wie z. B. [[Tkinter]] ([[GUIbuilder]]), [[WxPython]] ([[wxGlade]]), [[PyQt]] ([[Qt Designer]]) und [[PySide]], [[PyGTK]] ([[Glade]]), [[Kivy]] oder [[PyFLTK]] gibt es teils eigene Editoren, mit denen sich grafische Benutzeroberflächen zusammenklicken lassen und die Programmierarbeit entlasten.

== Verbreitung und Einsatz ==
* Python ist für die meisten gängigen Betriebssysteme frei erhältlich und eine der drei Sprachen, die häufig in einer [[LAMP (Softwarepaket)|LAMP]]-Umgebung eingesetzt werden. Um Python in den Webserver einzubinden, wurde [[mod python]] entwickelt, das die Ausführung im Vergleich zu [[Common Gateway Interface|CGI]] wesentlich beschleunigt und Daten persistent speichern kann. Als Alternative stellt [[Web Server Gateway Interface|WSGI]] eine universelle Schnittstelle zwischen Webserver und Python(-Framework) zur Verfügung.
* Eine Reihe von Web-Application-[[Framework]]s nutzt Python, darunter [[Django (Framework)|Django]], [[Pylons]], [[SQLAlchemy]], [[TurboGears]], [[web2py]], [[Flask]] oder [[Zope (Webanwendungsserver)|Zope]].
* Es gibt einen in [[Java (Programmiersprache)|Java]] implementierten Python-Interpreter namens [[Jython]], mit dem die Bibliothek des [[Java Runtime Environment]]s für Python verfügbar gemacht wird.
* Ebenso existiert eine Python-Implementierung ([[IronPython]]) für die [[.NET]]- bzw. [[Mono-Projekt|Mono]]-Plattform.
* Um Python als Skriptsprache für Programme in [[C++]] zu nutzen, setzt sich vermehrt die [[Boost (C++-Bibliothek)|Boost]].Python-Bibliothek durch.
* Ein Python-[[Parser]] für [[Parrot]] und ein in Python geschriebener Interpreter für Python, [[PyPy]], welcher von der EU gefördert wurde, sind ebenfalls in Entwicklung.
* Es gibt einen Python-Interpreter für das [[Symbian-Plattform|Symbian]]-Betriebssystem, so dass Python auf verschiedenen [[Mobiltelefon]]en verfügbar ist.
* Es existiert ein Python-Interpreter für [[Mikrocontroller]] namens PyMite.<ref>[http://wiki.python.org/moin/PyMite PyMite in der Python Wiki]</ref>
* Python in der Version 2.5.1 ist Bestandteil von [[AmigaOS]] 4.0.
* Python ist laut [[TIOBE-Index]] die erfolgreichste Programmiersprache der Jahre 2007 und 2010.<ref>http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html</ref><ref>[http://www.gulli.com/news/python-erfolgreichste-programmiersprache-2010-2011-01-10 gulli.com - nuws - Python: Erfolgreichste Programmiersprache 2010] (Zugriff am 1. Februar 2011)</ref>
* Python wird im Rahmen des Projektes [[100-Dollar-Laptop]] als Standardsprache für die Benutzeroberfläche verwendet. Da der 100-Dollar-Laptop für die Schulausbildung von Kindern konzipiert ist, soll bei Benutzung der dafür gestalteten [[Grafische Benutzeroberfläche|grafischen Benutzeroberfläche]] „Sugar“ auf Knopfdruck der gerade laufende Python-[[Quellcode]] angezeigt werden.<ref>OLPC-[[Wiki]]: „[http://wiki.laptop.org/go/Python Python für den 100-Dollar-Laptop]“</ref> Damit soll Kindern die Möglichkeit gegeben werden, die dahinter liegende Informationstechnologie real zu erleben und nach Belieben „hinter die Kulissen“ zu schauen.
* Mehrere kommerzielle Projekte wie z. B. Eve Online, Google und Youtube nutzen zu Teilen Python.<ref>[http://www.python.org/about/quotes/ ''Quotes about Python'']. Abgerufen am 25. Juni 2011.</ref>

== Kritik ==
* Bei der Definition (aber nicht beim Aufruf) von Methoden muss der Parameter ''self'', der der Instanz entspricht, dessen Methode aufgerufen wird, explizit angegeben werden. Dies wird oft als unelegant und „nicht objektorientiert“ empfunden.<ref name="KuchlingWarts">http://web.archive.org/web/20031002184114/www.amk.ca/python/writing/warts.html</ref> Es ist aber nötig, um bestimmte wichtige Konstrukte zu ermöglichen;<ref>Guido van Rossum: [http://neopythonic.blogspot.com/2008/10/why-explicit-self-has-to-stay.html Why explicit self has to stay]</ref> außerdem entspricht es dem Python-Grundsatz „Explicit is better than implicit“.<ref>[http://www.python.org/dev/peps/pep-0020/ The Zen of Python]</ref>
* In einer Methodendefinition erfordert der Aufruf der Basisklassenversion derselben Methode die explizite Angabe der Klasse und Instanz. Dies wird als Verletzung des DRY-Prinzips („[[Don't Repeat Yourself]]“) gesehen und behindert Umbenennungen. In Python&nbsp;3.0 wurde dies behoben.<ref>http://www.python.org/dev/peps/pep-3135/</ref>
* Einige in anderen Sprachen gebräuchliche Kontrollstrukturen, wie do/while,<ref name="KuchlingWarts" /> sind in Python nicht vorhanden und müssen auf andere Weise realisiert werden (z.&nbsp;B. durch „while&nbsp;True:&nbsp;…&nbsp;break“).
* Auf [[Multiprozessor]]-Systemen behindert der sogenannte ''Global Interpreter Lock'' (GIL) von [[CPython]] die Effizienz von Python-Anwendungen, die [[Softwareseitiges Multithreading]] benutzen. (Diese Beschränkung existiert unter [[Jython]] oder [[IronPython]] nicht.) Es ist nicht geplant, den GIL zu ersetzen. Stattdessen wird empfohlen, statt Threads mehrere miteinander kommunizierende Prozesse zu verwenden.<ref>http://www.python.org/doc/faq/library/#can-t-we-get-rid-of-the-global-interpreter-lock</ref><ref>http://www.artima.com/weblogs/viewpost.jsp?thread=214235</ref>
* In den aktuell vorherrschenden Implementationen ist die Geschwindigkeit niedriger als bei vielen kompilierbaren Sprachen,<ref name="shootout-c">[http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=python&lang2=gcc&box=1 Python–C]</ref> aber ähnlich wie bei [[Perl (Programmiersprache)|Perl]],<ref name="shootout-perl">[http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=python&lang2=perl Python–Perl]</ref> [[PHP]]<ref name="shootout-php">[http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=python&lang2=php Benchmark-Vergleich Python–PHP]</ref> oder [[Smalltalk-80 (Programmiersprache)|Smalltalk]]<ref name="shootout-php">[http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=python&lang2=vw Benchmark-Vergleich Python–Smalltalk]</ref> und höher als bei [[Ruby (Programmiersprache)|Ruby]].<ref name="shootout-ruby">[http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=python&lang2=ruby Benchmark-Vergleich Python–Ruby]</ref> Das liegt zum Teil daran, dass bei der Entwicklung von CPython Klarheit wichtiger als Performance eingestuft wird.<ref>[http://www6.uniovi.es/python/dev/culture/ Python Culture]</ref> Man beruft sich dabei auf Autoritäten wie [[Donald Knuth]] und [[Tony Hoare]], die von verfrühter Optimierung abraten. Wenn Performanceprobleme auftreten, die nicht durch Optimierung des Python-Codes gelöst werden können,<ref>[http://www.python.org/doc/essays/list2str.html Python Patterns – An Optimization Anecdote]</ref> setzt man einen [[Just-in-time-Kompilierung|JIT]]-Compiler wie [[PyPy]] ein oder lagert zeitkritische Funktionen in maschinennähere Sprachen wie C oder gar [[Assemblersprache|Assembler]] (CorePy) aus. Mit [[Cython]] steht auch ein [[Compiler]] zur Verfügung, mit dem Python-Code in effiziente C-Erweiterungen übersetzt oder externer C-Code angebunden werden kann.
* In den aktuell vorherrschenden Implementationen ist die Geschwindigkeit niedriger als bei vielen kompilierbaren Sprachen,<ref name="shootout-c">[http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=python&lang2=gcc&box=1 Python–C]</ref> aber ähnlich wie bei [[Perl (Programmiersprache)|Perl]],<ref name="shootout-perl">[http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=python&lang2=perl Python–Perl]</ref> [[PHP]]<ref name="shootout-php">[http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=python&lang2=php Benchmark-Vergleich Python–PHP]</ref> oder [[Smalltalk-80 (Programmiersprache)|Smalltalk]]<ref name="shootout-php">[http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=python&lang2=vw Benchmark-Vergleich Python–Smalltalk]</ref> und höher als bei [[Ruby (Programmiersprache)|Ruby]].<ref name="shootout-ruby">[http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=python&lang2=ruby Benchmark-Vergleich Python–Ruby]</ref> Das liegt zum Teil daran, dass bei der Entwicklung von CPython Klarheit wichtiger als Performance eingestuft wird.<ref>[http://www6.uniovi.es/python/dev/culture/ Python Culture]</ref> Man beruft sich dabei auf Autoritäten wie [[Donald Knuth]] und [[Tony Hoare]], die von verfrühter Optimierung abraten. Wenn Performanceprobleme auftreten, die nicht durch Optimierung des Python-Codes gelöst werden können,<ref>[http://www.python.org/doc/essays/list2str.html Python Patterns – An Optimization Anecdote]</ref> setzt man einen [[Just-in-time-Kompilierung|JIT]]-Compiler wie [[PyPy]] ein oder lagert zeitkritische Funktionen in maschinennähere Sprachen wie C oder gar [[Assemblersprache|Assembler]] (CorePy) aus. Mit [[Cython]] steht auch ein [[Compiler]] zur Verfügung, mit dem Python-Code in effiziente C-Erweiterungen übersetzt oder externer C-Code angebunden werden kann.
* Python 3.0 ist die erste Version, bei der die Abwärtskompatibilität teilweise nicht mehr gegeben ist.
* Python 3.0 ist die erste Version, bei der die Abwärtskompatibilität teilweise nicht mehr gegeben ist.

Version vom 1. Februar 2013, 13:53 Uhr

{{Infobox Programmiersprache |Name = Python |Logo = Datei:Python logo.svg |Paradigma = multiparadigmatisc |Erscheinungsjahr = 1991 Der Name geht nicht etwa (wie das Logo vermuten ließe) auf die gleichnamige Schlangengattung (Pythons) zurück, sondern bezog sich ursprünglich auf die englische Komikertruppe Monty Python. In der Dokumentation finden sich daher auch einige Anspielungen auf Sketche aus dem Flying Circus.[1] Trotzdem etablierte sich die Assoziation zur Schlange, was sich unter anderem in der Programmiersprache Cobra[2] sowie dem Python-Toolkit „Boa“[3] äußert.

Ziele

Python wurde mit dem Ziel entworfen, möglichst einfach und übersichtlich zu sein. Dies soll durch zwei Maßnahmen erreicht werden: Zum einen kommt die Sprache mit relativ wenigen Schlüsselwörtern aus,[4] zum anderen ist die Syntax reduziert und auf Übersichtlichkeit optimiert.

Durch die Möglichkeit, auch Programme anderer Sprachen als Modul einzubetten, werden viele Nischen in der Programmierung abgedeckt. Bei Bedarf lassen sich so beispielsweise zeitkritische Teile durch in maschinennäheren Sprachen, wie z. B. C, programmierte Routinen ersetzen, oder Python kann als Skriptsprache eines anderen Programms dienen (z. B. Blender, Cinema 4D, GIMP, Maya, OpenOffice.org, PyMOL, SPSS, etc.).

Python ist eine Multiparadigmensprache. Das heißt, Python zwingt den Programmierer nicht zu einem einzigen bestimmten Programmierparadigma, sondern erlaubt es, das für die jeweilige Aufgabe am besten geeignete Paradigma zu wählen. Objektorientierte und strukturierte Programmierung werden vollständig unterstützt, weiterhin gibt es Spracheigenschaften für funktionale und aspektorientierte Programmierung.

Die Datentypen werden dynamisch verwaltet; eine statische Typprüfung (wie z. B. bei C++) gibt es nicht. Die Freigabe nicht mehr benutzter Speicherbereiche erfolgt durch automatische Speicherbereinigung (garbage collection). Unicode-Unterstützung existiert seit Version 2.0.

Ab der Versionsreihe 2.6 können sich Entwickler mit dem Kommandozeilenparameter „-3“ alle Konstrukte in ihrem Code anzeigen lassen, die es ab Python 3.0 nicht mehr gibt.[5]

Datentypen und Strukturen

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

Es verfügt über die übliche Ausstattung an Zeichenkettenoperationen. Zeichenketten sind in Python allerdings unveränderliche Objekte (wie auch in Java). Damit führen Operationen, die das Ändern einer Zeichenkette bewerkstelligen sollen – wie z. B. das Ersetzen von Zeichen – dazu, dass stattdessen eine neue Zeichenkette zurückgegeben wird.

In Python ist alles ein Objekt; Klassen, Typen, Methoden, Module etc. Der Datentyp ist jeweils an das Objekt (den Wert) gebunden und nicht an eine Variable, d. h. Datentypen werden dynamisch vergeben, so wie bei Smalltalk oder LISP – und nicht wie bei Java.

Trotz der dynamischen Typverwaltung enthält Python eine gewisse Typprüfung. Diese ist strenger als bei Perl, aber weniger strikt als etwa bei Objective CAML. Implizite Umwandlungen nach dem Duck-Typing-Prinzip sind unter anderem 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 gibt es allerdings keine implizite Umwandlung zwischen Zahlen und Zeichenketten; in Operationen für Zeichenketten kann also anstelle einer Zeichenkette nicht direkt eine Zahl verwendet werden. Der Operator == überprüft zwei Objekte auf (Wert-)Gleichheit. Der Operator is überprüft die tatsächliche Identität zweier Objekte.[6]

Sammeltypen

Python besitzt mehrere Sammeltypen, darunter Listen, Tupel, Mengen (Sets) und assoziative Arrays. Listen, Tupel und Zeichenketten sind Folgen (Sequenzen, Arrays) und kennen fast alle die glen z Anonyme Namensräume (sog. [[C

  • Bei der Definition (aber ni]] benutzen. (Diese Beschränkung existiert unter Jython oder IronPython nicht.) Es ist nicht geplant, den GIL zu ersetzen. Stattdessen wird empfohlen, statt Threads mehrere miteinander kommunizierende Prozesse zu verwenden.[7][8]
  • In den aktuell vorherrschenden Implementationen ist die Geschwindigkeit niedriger als bei vielen kompilierbaren Sprachen,[9] aber ähnlich wie bei Perl,[10] PHP[11] oder Smalltalk[11] und höher als bei Ruby.[12] Das liegt zum Teil daran, dass bei der Entwicklung von CPython Klarheit wichtiger als Performance eingestuft wird.[13] Man beruft sich dabei auf Autoritäten wie Donald Knuth und Tony Hoare, die von verfrühter Optimierung abraten. Wenn Performanceprobleme auftreten, die nicht durch Optimierung des Python-Codes gelöst werden können,[14] setzt man einen JIT-Compiler wie PyPy ein oder lagert zeitkritische Funktionen in maschinennähere Sprachen wie C oder gar Assembler (CorePy) aus. Mit Cython steht auch ein Compiler zur Verfügung, mit dem Python-Code in effiziente C-Erweiterungen übersetzt oder externer C-Code angebunden werden kann.
  • Python 3.0 ist die erste Version, bei der die Abwärtskompatibilität teilweise nicht mehr gegeben ist.

Literatur

Für den Einstieg

Referenzen

  • Martin von Löwis, Nils Fischbeck: Python 2 – Einführung und Referenz der objektorientierten Skriptsprache, Addison-Wesley, ISBN 3-8273-1691-X
  • Michael Weigend: Python GE-PACKT, mitp-Verlag, ISBN 3-8266-0724-4
  • Michael Lauer: Python und GUI-Toolkits, mitp-Verlag, ISBN 3-8266-0844-5

Weiterführendes

Commons: Python – Sammlung von Bildern, Videos und Audiodateien
Wikiversity: Kurs:Python – Kursmaterialien
Wikibooks: Python 2 unter Linux – Lern- und Lehrmaterialien

Einzelnachweise

  1. Offizielle Python FAQ, sowie Python Tutorial, Kapitel 1
  2. Cobra
  3. http://boa-constructor.sourceforge.net
  4. http://docs.python.org/ref/keywords.html
  5. heise.de: Python 2.6 öffnet Wege zu Version 3 vom 2. Oktober 2008, abgerufen am 4. Oktober 2008
  6. http://my.safaribooksonline.com/0596002815/lpython2-CHP-7-SECT-6
  7. http://www.python.org/doc/faq/library/#can-t-we-get-rid-of-the-global-interpreter-lock
  8. http://www.artima.com/weblogs/viewpost.jsp?thread=214235
  9. Python–C
  10. Python–Perl
  11. a b Benchmark-Vergleich Python–PHP Referenzfehler: Ungültiges <ref>-Tag. Der Name „shootout-php“ wurde mehrere Male mit einem unterschiedlichen Inhalt definiert.
  12. Benchmark-Vergleich Python–Ruby
  13. Python Culture
  14. Python Patterns – An Optimization Anecdote

Vorlage:Link FA Vorlage:Link GA