Für viele meiner Projekte habe ich die Programmiersprache Python verwendet. In diesem Artikel begründe ich kurz, wieso ich Python anderen Sprachen vorziehe.

Python Steckbrief

Name Python (abgeleitet von Monty Python und nicht wie viele meinen von der Python-Schlange)
Paradigmen Objektorientiert, Funktional, Aspektorientiert, usw.
Ersterscheinung Die erste Version wurde 1991 von Guido van Rossum veröffentlicht
Programming Ranking Rang 5 im TIOBE Index (Stand: 03/17)
Webseite www.python.org

Ziele der Sprache Python

Bei der Entwicklung von Python wurde besonders großer Wert auf einen einfachen und übersichtlichen Quellcode gelegt. Deshalb wurde der Python-Syntax - im Vergleich zu dem Syntax anderer Sprachen - stark reduziert und vereinfacht. Außerdem bietet Python für eine hohe Sprache mit gut 40 Operatoren nur die Notwendigsten an - zum Vergleich: In Perl werden gut 100 Operatoren definiert.

Außerdem verzichtet Python komplett auf geschweifte Klammern zum strukturieren des Quellcodes. Stattdessen setzt der Python-Syntax auf Einrückung. Das hat den positiven Nebeneffekt, dass Entwickler, die mit Python entwickeln dazu gezwungen werden den Quellcode ordentlich zu strukturieren - bei Programmierern anderer Sprachen ist dies (leider) nicht immer gegeben... ;)

Hier unten habe ich ein C- und ein Python-Programm als Beispiel eingeblendet. Beide Beispiele definieren eine Funktion zum rekursiven Berechnen einer Fakultät. Schon beim ersten Blick fällt aus, dass der Python-Code mit deutlich weniger Syntax-Symbolen (z.B. geschweifte Klammern oder Semikolons) auskommt und deswegen deutlich lesbarer ist.

# Python

def fakultaet(x):
    if x > 1:
        return x * fakultaet(x - 1)
    else:
        return 1


// C

int fakultaet(int x) {
    if (x > 1) {
        return x * fakultaet(x - 1);
    } else {
        return 1;
    }
}

Datentypen und Objekte

Python bietet eine Reihe an Datentypen, die einer hohen Sprache mehr als gerecht werden. Die einzelnen Typen besitzen eine große Reihe an Methoden, die für verschiedenste Zwecke verwendet werden können, auf die ich in diesem Artikel nicht näher eingehen werde.

In Python ist alles ein Objekt. Egal ob Zahlen, Klassen, Module oder Methoden. Da Python dynamisch Typisiert ist hängt der Datentyp nicht von der Deklaration der Variable, sondern "vom Inhalt des Objektes" ab. Mehr dazu im Abschnitt Dynamische Datentypen.

Dynamische Datentypen

Während in Sprachen wie C oder Java der Typ von der Deklaration der Variable abhängt (statische Typisierung), ist der Datentyp in Python, dank der dynamischen Typisierung, fest mit dem "Inhalt des Objektes" gebunden. So ist es beispielsweise möglich einer Variable nacheinander zwei Objekte zuzuweisen, die nicht denselben Datentyp besitzen:

# Python

a = "Hello World!"  # Zuweisung einer Zeichkette
print(a.upper())    # Gibt auf der Konsole "HELLO WORLD!" aus
a = 123             # Zuweisung eines Integers
print(a.upper())    # TypeError, da für den Integer-Datentyp keine Methode upper definiert ist

Die statische Typisierung bietet den Vorteil, dass es zur Laufzeit nur sehr selten zu Typfehlern kommt, dafür bezahlt man häufig jedoch einen hohen Preis:

Möchte man beispielsweise eine Methode definieren, die mit verschiedene Parametern aufgerufen wird, so muss man in Sprachen mit statischer Typisierung dafür viel Aufwand betreiben. Für jede Parameter-Kombination muss eine eigene Methode definiert werden, sodass sich diese gegenseitig überladen. So muss schon für relativ einfache Aufgaben viel Schreibarbeit geleistet werden.

Bei Sprachen wie Python, die eine dynamische Typisierung besitzen, besteht dieser Aufwand nicht. Es muss nur eine Funktion definiert werden, bei denen der Typ der Parameter nicht statisch festgelegt werden muss. Beim Aufrufen der Methode kann dann innerhalb dieser definiert werden, welche Aktionen bei welchen Datentypen ausgeführt werden soll. Die Standard-Funktionen von Python sind - soweit möglich - darauf ausgelegt mit möglichst vielen Datentypen umgehen zu können, was den Aufwand für den Programmierer enorm verringert.

Letzten endlich wird der Prozessor bei dynamischer Typisierung ähnlich belastet, wie bei statischer Typisierung. Der Aufwand für den Programmierer unterscheidet sich jedoch gravierend.

Deutlich wird dies bei dem Beispiel hier unten. Während in Java zwei (oder sogar mehr) überladene Methoden definiert werden müssen, reicht in Python eine Methode aus, in der während der Ausführung der mitgegebene Parameter in ein benötigtes Double-Objekt umgewandelt wird:

# Python

def rechnePlusEins(zahl):
    return double(zahl) + 1;

print(rechnePlusEins(15))
print(rechnePlusEins("15"))
// JAVA

double rechnePlusEins(String zahl) {
    double zahlAsDouble = Double.parseDouble(zahl);
    return rechnePlusEins(zahlAsDouble);
}
double rechnePlusEins(double zahl) { return zahl + 1d; } System.out.println(rechnePlusEins(15)); System.out.println(rechnePlusEins("15"));

Standardbibliotheken

Einer der größten Vorteile von Python ist seine - im Vergleich zu anderen Sprachen - gigantische Standardbibliothek. Diese können zum großen Teil plattformunabhängig verwendet werden, was ebenfalls einen großen Vorteil darstellt.

Für quasi alle Probleme gibt es entweder Lösungen aus dem Python-Standard, oder aus der großen Bibliotheken-Sammlung des Word Wide Webs. Viele Erweiterungen sind im PyPI, dem Python Package Index zur Verfügung gestellt und können von dort aus einfach heruntergeladen und automatisiert installiert werden.

Sollte das benötigte Paket doch noch nicht existieren, können eigene Module entweder in Python, oder auch in C ergänzt werden.

Kritik

Python bietet viele Vorteile gegenüber anderer Programmiersprachen. Dennoch werden einige Aspekte der Sprache von vielen Seiten aus kritisiert...

Ein großes Manko von cPython, dem Standard-Interpret von Python, ist der sgn. Global Interpreter Lock, auch GIL abgekürzt. Dieser verhindert das effiziente Arbeiten, wenn in einem Projekt mehrere Threads verwendet werden.

Ein weiterer Kritikpunkt ist die Geschwindigkeit von Python-Projekten. Diese ist geringer als die von Projekten, die mit Compiler-Sprachen entwickelt wurden. Dieser Unterschied ist jedoch dem Prinzip von Interpreter-Sprachen geschuldet.

Für die meisten Anwendungen reicht die Geschwindigkeit von Python jedoch vollkommen aus. Sollte dies einmal doch nicht der Fall sein, können Teile des Projektes in C "ausgelagert" werden, sodass diese kritischen Aufgaben nicht mehr mit Python ausgeführt werden.

Fazit

Der Grund dafür, dass ich Python für so gut wie alle meine Projekte benutze ist ihr klarer und übersichtlicher Syntax, sowie die gigantische Bibliotheks-Sammlung, die für quasi alle Probleme eine passende Lösung bietet. Auch die dynamische Typisierung ist meiner Meinung nach sinnvoll, wobei auch die statische Programmierung einige Vorteile bietet...