Python (Programmiersprache)


aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche
Python
Logo
Basisdaten
Paradigmen: multiparadigmatisch
Erscheinungsjahr: 1991
Entwickler: Python Software Foundation
Aktuelle Version: 3.5.1 (6. Dezember 2015),
2.7.11  (5. Dezember 2015)
Typisierung: stark, dynamisch („Duck-Typing“)
Wichtige Implementierungen: CPython, Jython, IronPython, PyPy
Beeinflusst von: ABC, Algol 68, Modula-3, Icon, C, C++, Perl, Java, Lisp, Haskell;
Beeinflusste: Ruby, Boo, Groovy, Cython, Swift;
Lizenz: Python Software Foundation Lizenz<ref>Python License</ref>
www.python.org

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

Anonyme Namensräume (sog. Closures) sind mit den o. g. Mechanismen in Python ebenfalls einfach möglich. Ein simples Beispiel für einen 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 POP, PUSH, ISEMPTY, um den Stack zu modifizieren bzw. auf enthaltene Elemente zu prüfen, ohne l 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. B. Fehler-Rückgabewerte und globale Statusvariablen). Sie sind 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 Conditions 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:

   num = raw_input("Eine Zahl eingeben: ")
   try:
       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 int() 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 (SIGINT, häufig Strg+C) mittels Ausnahmebehandlung in Python abgefangen und behandelt werden (except KeyboardInterrupt: …).

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 OS 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 MIME und HTTP). Module zur Schaffung grafischer Schnittstellen, zur Verbindung mit relationalen Datenbanken und zur Manipulation regulärer Ausdrücke sind ebenfalls enthalten.

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 darüber hinaus eine Vielzahl von weiteren Wrappern von anderen Anbietern. Sie stellen Anbindungen (engl. language bindings) zu GUI-Bibliotheken wie z. B. PyGTK, PyQt, PyKDE, wxPython, PyObjC und PyFLTK zur Verfügung.

Beispiel

Als nicht triviales Beispiel sei hier der kompakte Sortieralgorithmus Quicksort 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 iterative 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>

Dies ist nur ein Beispiel für die gesparte Schreibarbeit durch die Listennotation. Tatsächlich ist in diesem Fall die iterative Formulierung die schnellere, da pro Durchgang nur einmal über das Array „liste“ iteriert wird, und nicht zweimal wie in der Listennotation.

Interaktive Benutzung

So wie Lisp, Ruby, Groovy und 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 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 unixoide Computer-Betriebssysteme zur Verfügung, der neben klassischen Unix-Shellkommandos auch direkte Eingaben in Python-Form verarbeiten kann. IPython ist eine populäre interaktive Python-Shell und IDE mit stark erweiterter Funktionalität.

Implementierungen

Mit Cython steht ein Compiler zur Verfügung, mit dem Python-Code in effiziente C-Erweiterungen übersetzt oder externer C-Code angebunden werden kann. Ferner gibt es einen in Java implementierten Python-Interpreter namens Jython, mit dem die Bibliothek des Java Runtime Environments für Python verfügbar gemacht wird. Ebenso existiert eine Python-Implementierung (IronPython) für die .NET- bzw. Mono-Plattform. Um Python als Skriptsprache für Programme in C++ zu nutzen, setzt sich vermehrt die 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 existiert ein Python-Interpreter für Mikrocontroller namens PyMite.<ref>PyMite in der Python Wiki</ref>

Entwicklungsumgebung

Neben IDLE, das oft mit Python installiert wird und im Wesentlichen aus einer Textumgebung und einer Shell besteht, wurden auch einige vollwertige Entwicklungsumgebungen (IDEs) für Python entwickelt, beispielsweise Eric Python IDE oder PyCharm. Des Weiteren existieren Plugins für größere IDEs wie Eclipse, Visual Studio und NetBeans. Texteditoren für Programmierer wie Vim und Emacs lassen sich gegebenenfalls auch für Python anpassen. Allerdings ist keine IDE notwendig, da Pythoncode nicht kompiliert werden muss, sodass sich Skripte grundsätzlich auch mit einem beliebigen Texteditor schreiben lassen.

Für die verschiedenen GUI-Frameworks, wie z. B. Tkinter (GUI-Builder), WxPython (wxGlade), PyQt (Qt Designer), PySide, PyGTK (Glade), Kivy oder PyFLTK gibt es teils eigene Editoren, mit denen sich grafische Benutzeroberflächen auf vergleichsweise einfache Art aufbauen lassen.

Paketverwaltung

Python unterstützt die Erstellung von Paketen. Beim Erstellen der Pakete helfen distutils und setuptools. Die Pakete werden auf PyPI, dem Python Package Index, gespeichert und von dort zur Installation abgerufen. Als Paketmanager wird üblicherweise pip oder auf alten Systeme auch easy_install eingesetzt.

Verbreitung und Einsatz

Python ist für die meisten gängigen Betriebssysteme frei erhältlich und bei den meisten Linux-Distributionen im Standardumfang enthalten. Um Python in Webserver einzubinden, wird Webserver-umgreifend WSGI verwendet, welches die Nachteile von CGI umgeht. WSGI stellt eine universelle Schnittstelle zwischen Webserver und Python(-Framework) zur Verfügung.

Eine Reihe von Web-Application-Frameworks nutzt Python, darunter Django, Pylons, SQLAlchemy, TurboGears, web2py, Flask und Zope. Ferner gibt es einen Python-Interpreter für das Symbian-Betriebssystem, so dass Python auf verschiedenen Mobiltelefonen verfügbar ist. In der Version 2.5.1 ist Python ein Bestandteil von AmigaOS 4.0. Außerdem basieren mehrere bekannte kommerzielle Projekte, etwa Google und YouTube, in Teilen auf Python.<ref>Quotes about Python. Abgerufen am 25. Juni 2011.</ref> Auch in der Spieleindustrie findet die Sprache bisweilen Einsatz, etwa in EVE Online, World in Conflict und Civilization IV.

Im Rahmen des Projektes 100-Dollar-Laptop wird Python als Standardsprache der Benutzeroberfläche verwendet. Da der 100-Dollar-Laptop für die Schulausbildung von Kindern konzipiert ist, soll bei Benutzung der dafür gestalteten grafischen Benutzeroberfläche „Sugar“ auf Knopfdruck der gerade laufende Python-Quellcode angezeigt werden.<ref>OLPC-Wiki: „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.

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://www.amk.ca/python/writing/warts.html (Memento vom 2. Oktober 2003 im Internet Archive)Vorlage:Webarchiv/Wartung/Linktext_fehlt</ref> Es ist aber nötig, um bestimmte wichtige Konstrukte zu ermöglichen;<ref>Guido van Rossum: Why explicit self has to stay</ref> außerdem entspricht es dem Python-Grundsatz „Explicit is better than implicit“.<ref name="Zen" />

Bis zur Version 3.0 wurde kritisiert, dass in einer Methodendefinition der Aufruf der Basisklassenversion derselben Methode die explizite Angabe der Klasse und Instanz erfordert. Dies wurde als Verletzung des DRY-Prinzips („Don’t repeat yourself“) gesehen, außerdem behinderte es Umbenennungen. In Python 3.0 wurde dieser Kritikpunkt behoben.<ref>python.org</ref>

Einige in anderen Sprachen gebräuchliche Kontrollstrukturen sind in Python nicht vorhanden und müssen daher mithilfe von Ersatzstrukturen nachgeahmt werden.<ref name="KuchlingWarts" />

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 allerdings nicht. Bislang ist von offizieller Seite nicht geplant, den GIL zu ersetzen. Stattdessen wird empfohlen, mehrere miteinander kommunizierende Prozesse anstelle von Threads zu verwenden.<ref>python.org</ref><ref>artima.com</ref>

In den aktuell vorherrschenden Implementationen ist die Geschwindigkeit niedriger als bei vielen kompilierbaren Sprachen,<ref name="shootout-c">Python–C</ref> aber ähnlich wie bei Perl,<ref name="shootout-perl">Python–Perl</ref> PHP<ref name="shootout-php-1">Benchmark-Vergleich Python–PHP</ref> oder Dart<ref name="shootout-php-2">Benchmark-Vergleich Python–Dart</ref> und höher als bei Ruby.<ref name="shootout-ruby">Benchmark-Vergleich Python–Ruby</ref> Das liegt zum Teil daran, dass bei der Entwicklung von CPython der Klarheit des Codes gegenüber der Geschwindigkeit Vorrang eingeräumt wird.<ref>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>Python Patterns – An Optimization Anecdote (offline)</ref> werden stattdessen JIT-Compiler wie PyPy verwendet oder zeitkritische Funktionen in maschinennähere Sprachen wie C oder gar Assembler (CorePy) ausgelagert.

Einzelnachweise

<references />

Literatur

Für den Einstieg

  •  Martina Glöde (Hrsg.): Programmieren supereasy. Einfacher Einstieg in Scratch und Python. Dorling Kindersley, München 2015 (übersetzt von Birgit Reit), ISBN 978-3-8310-2700-2, S. 224.
  •  Warren D. Sande; Carter Sande: Hello World! Programmieren für Kids und andere Anfänger. 2., akt. u. erw. Auflage. Hanser, München 2014 (übersetzt von Jürgen Dubau), ISBN 978-3-446-43806-4, S. 475.

Referenzen

Weiterführendes

  • Gregor Lingl: Python für Kids, bhv, 4. Auflage 2010, ISBN 3-8266-8673-X.
  • Farid Hajji: Das Python-Praxisbuch, Addison-Wesley, 1. Auflage 2008, ISBN 978-3-8273-2543-3.
  • Hans P. Langtangen: Python Scripting for Computational Science, Springer, 3. Auflage 2008, ISBN 3-540-43508-5.
  • Michael Weigend: Objektorientierte Programmierung mit Python, mitp-Verlag, 1. Auflage 2006, ISBN 3-8266-0966-2.

Weblinks

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

Siehe auch

  • pip, Paketverwaltungsprogramm für Programmpakete aus dem Python Package Index
  • virtualenv, ermöglicht die Erstellung von isolierten (virtuellen) python Umgebungen auf dem lokalen Rechner.
Gesprochene Wikipedia Dieser Artikel ist als Audiodatei verfügbar:

150px Speichern | Informationen | 20.30 min (13,0 MB) Text der gesprochenen Version (5. Januar 2010)

Mehr Informationen zur gesprochenen Wikipedia
24px Dieser Artikel wurde am 23. Oktober 2005 in dieser Version in die Liste der lesenswerten Artikel aufgenommen.