
Python ist eine plattformunabhängige, interpretierte, dynamisch typisierte, prozedurale und objektorientierte Programmiersprache, die aber auch funktionale und aspektoriente Paradigmen unterstützt. Die Sprache ist Anfang der 1990er Jahre von dem Niederländer Guido van Rossum ins Leben gerufen worden. Bis 2018 war Guido van Rossum als Benevolent Dictator For Life (BDFL) maßgeblich für die Leitung und Designentscheidungen bei der Weiterentwicklung der Sprache verantwortlich. Der Name Python ist in Anlehnung an die britische Komikertruppe Monty Python gewählt worden.
Alleinstellungsmerkmale
Python zeichnet sich vor allem durch seine schlanke und leicht lesbare Syntax aus. Damit ist Python eine sehr gute Einsteigersprache und meine persönliche Empfehlung für jemanden, der eine erste Programmiersprache lernen möchte.
Einsatzbereiche
Python ist wegen seiner guten nativen Unterstützung für diverse Datentypen im Bereich Data Science sehr populär. Aufgrund seiner schlanken Syntax und zahlreichen Bibliotheken eignet sich Python allgemein gut für Prototyping und Scripting.
Mit Django bietet Python ein populäres Webframework. PyTorch ist eine beliebte Bibliothek für maschinelles Lernen. Pandas und NumPy sind zwei Bibliotheken, die in den Bereichen Data Science und Mathematik eingesetzt werden. Beim Einplatinencomputer Raspberry Pi steht Pi für Python Interpreter, welcher ursprünglich fest eingebaut werden sollte.
Bekannte Unternehmen, die Python einsetzen, sind Google, Facebook, Instagram, Spotify, Netflix, Dropbox, Reddit, Quora und Disqus.
Pros
Python ist schlank und leicht lesbar und ist damit sehr gut für Anfänger als auch für Profis geeignet. Die Sprache ist weit verbreitet, hat eine große Community und bietet sehr viele Bibliotheken, womit Python für diverse Zwecke eingesetzt werden kann.
Python unterstützt nativ Tupel, Listen, Mengen (Sets), assoziative Arrays (Maps / Dictionaries) und komplexe Zahlen, was das folgende Beispiel verdeutlicht:
# komplexe Zahl
a = (1+2j)
# leere Liste
a = []
# Liste mit drei Elementen (int, String und boolean)
a = [1, 'test', true]
# Tupel mit zwei Elementen (int und String)
a = (1, 'test')
# leeres Dictionary
a = {}
# Dictionary mit zwei Elementen (int als Schlüssel, String als Wert)
a = {1: 'a', 2: 'b'}
Für Strings wie für Listen gibt es in Python native Unterstützung um auf Untermengen zuzugreifen. Dabei wird hinter dem String oder der Liste in eckigen Klammern ein Wertebereich angegeben, wobei eine negative Zahl für den Index vom Ende des Strings bzw. der Liste aus steht:
# ein String
a = 'Python'
# eine Liste mit Strings, jeweils aus einem Buchstaben bestehend
b = ['P', 'y', 't', 'h', 'o', 'n']
a[:3] # Pyt
b[:3] # ['P', 'y', 't']
a[3:] # hon
b[3:] # [h', 'o', 'n']
a[1:5] # ytho
a[1:5] # ['y', 't', h', 'o']
a[1:-1] # ytho
b[1:-1] # ['y', 't', h', 'o']
Auch für Stringformatierung bietet Python native Unterstützung:
pi = 3.14159265
# Float wird mit zwei Nachkommastellen als String formatiert => '3.14'
str = '%.2f' % pi
Python bietet Klassen, Interfaces und Vererbung, kann aber auch nur mit Funktionen (ohne Klassen) oder sogar komplett ohne diese eingesetzt werden.
Mit Python kommt auch eine REPL (read evaluate print loop), die ich persönlich gerne als Taschenrechner einsetze. Python ist grundsätzlich auf Mac und fast allen Linux-Distributionen vorinstalliert und kann daher schnell mal einfach ausprobiert werden.
Cons
Wie andere Interpretersprachen ist Python langsamer als Sprachen wie C und Go, was aber versucht wird mit auf Performance getrimmten Implementierungen der Sprache wie Cython und MicroPython auszugleichen.
Mein größter Kritikpunkt an Python ist der Einsatz von Einrückungen als Strukturelemente, ähnlich wie in der Auszeichnungssprache YAML. Während andere Sprachen Blöcke durch geschweifte Klammern oder das Schlüsselwort end
begrenzen, tut Python dies durch Einrückungen (Tabs oder mehrere Leerzeichen), was nur dann gut funktioniert, wenn alle beteiligten Entwickler die gleiche Tablänge verwenden.
for i in range(1, 4):
print(i)
print('fertig')
# Ausgabe:
1
2
3
fertig
# aber:
for i in range(1, 4):
print(i)
print('fertig')
# Ausgabe:
1
fertig
2
fertig
3
fertig
Weiterhin stört mich an Python, dass es keine privaten Felder oder Funktionen gibt. Üblicherweise markiert man interne Variablen und Funktionen mit einem vorausgehenden Unterstrich, was den Zugriff darauf von außen aber nicht verhindert.
class Test:
def _privateFunction(self):
print('really private')
Test()._privateFunction()
Im Code-Beispiel oben hat die Klasse Test eine als privat markierte Funktion privateFunction
. Die letzte Codezeile ist außerhalb der Klasse, da die Zeile nicht eingerückt ist. Beim Ausführen des Codes wird diese letzte Zeile ausgeführt und führt zu folgender Programmausgabe:
really private
Dieses Code-Beispiel veranschaulicht auch eine weitere Eigenschaft, die mich an Python stört: Instanzfunktionen benötigen immer self
als ersten Parameter, da dieser beim Aufruf implizit mitgegeben wird. Entfernt man den Parameter im Code oben, führt dies zu folgender Fehlermeldung:
TypeError: _privateFunction() takes 0 positional arguments but 1 was given
Ein weiterer Kritikpunkt ist die Syntax bei der Listenverarbeitung, die in Python schwer lesbar werden kann. Die folgende Zeile Code etwa gibt das mehrzeilige Ergebnis einer SQL-Abfrage als String formatiert aus:
'\n'.join([''.join(['\t{:3}'.format(col) for col in row]) for row in res])
Ich verwende Python sehr gerne zum Skripting und Prototyping sowie für kleinere Programme, setze für größere Geschäftsanwendungen aber lieber auf eine Sprache wie Java, die mir mehr Freiheiten bei der Modellierung einer Geschäftsdomäne gibt.
Datenblatt
Name | Python |
Webseite | https://www.python.org/ |
Erscheinungsjahr | 1991 |
Aktuellste Version (Stand 16. August 2020) | Version 3.8.5 vom 20. Juli 2020 |
Typisierung | dynamisch |
Paradigmen | imperativ prozedural objektorientiert funktional aspektorientiert |
Pros | Cons |
---|---|
gute Einsteigersprache | langsamer als kompilierbare Sprachen |
weit verbreitet, große Community | Einrückungen als Strukturelemente |
leicht zu lesen | Listenverarbeitungen teils schwer lesbar |
schlanke Syntax | keine wirklich privaten Funktionen und Felder |
viele native Datentypen (z.B. Tupel, Listen, Sets, Dictionaries, komplexe Zahlen) | explizites „self“ für Instanzfunktionen |
viele Bibliotheken | |
plattformunabhängig | |
interaktive Shell (REPL) |
virtuallet
virtuallet ist ein kleines Programm von mir, welches ich in diversen Programmiersprachen implementiert habe. Hier geht es direkt zum Python-Code von virtuallet auf GitLab. Hier gibt es weitere Infos zu virtuallet.