Python als Erstsprache

Vorgeschichte

Ich habe Python im Jahr 2007 entdeckt – auf der Suche nach einer geeigneten Programmiersprache für den Informatikunterricht im Wahlpflichtbereich (seinerzeit Klasse 9/10). Bis dahin hatte Pascal für einige Jahre gute Dienste geleistet.

Die Anfänge von Pascal reichen allerdings zurück bis in die frühen 70er Jahre des letzten Jahrhunderts, und das merkt man der Sprache auch an. Modernere Sprachkonzepte, wie etwa die Objektorientierung, wurden Jahre später nachträglich oben draufgepackt. Die Möglichkeiten der Benutzerinteraktion waren nicht mehr zeitgemäß. Eine Erweiterung von Pascal auf Delphi/Lazarus war für die Sekundarstufe I nicht angezeigt. Also habe ich mich umgesehen ...

Java, JavaScript, Ruby, PHP und einige andere habe ich mir angesehen. Experimente gemacht und schließlich die meisten dieser Sprachen als nicht geeignet verworfen. Übrig geblieben ist Python.

Erstsprache Python

Bis dahin hatte ich hauptsächlich in Pascal (inkl. Delphi, Kylix und Lazarus) und Java programmiert und so war ich – und bin es bis heute – sehr bald von der Einfachheit und zugleich unglaublichen Leistungsfähigkeit von Python angetan.

Kleinere Programmierprobleme lassen sich fix mit ein paar Zeilen lösen. Auf der anderen Seite lassen sich selbst komplexe Programme mit GUI entwickeln oder HTML-Seiten dynamisch (serverseitig) erzeugen und im Browser anzeigen. Formulare auf Webseiten lassen sich auslesen und verarbeiten. Und die Datenstrukturen, die Python mitbringt, sind elegant, mächtig und effizient.

Hinzu kommt das – gerade für Programmieranfänger – geniale Prinzip der Blockbildung durch Einrückung. Es zwingt zum strukturierten Programmieren und reduziert zugleich die Anzahl an Klammern oder Schlüsselwörtern, was erheblich zur guten Lesbarkeit von Quelltexten beiträgt bzw. beitragen kann.

Außerdem ist Python einschließlich einer für den Informatikunterricht völlig ausreichenden integrierten Entwicklungsumgebung (IDE) kostenlos und für alle gängigen Betriebssysteme verfügbar.

Und – last, but not least – Python ist verglichen mit manchen anderen Sprachen hervorragend dokumentiert. Die offizielle Dokumentation ist enorm umfangreich und immer auf aktuellstem Stand. Aktualität und Qualität kann man ebenfalls dem deutschen Python-Forum bescheinigen – auch hier hebt sich Python positiv von vielen anderen Sprachen ab.

Ein Beispiel

Der Anwender soll eine natürliche Zahl eingeben, das Programm addiert alle ganzzahligen Werte von 1 bis zu dieser Zahl und gibt die Summe als Ergebnis aus.
Ja, man kann das mit der Gaußschen Summenformel auch direkt berechnen ...
Zum Vergleich zeige ich eine Lösung in Pascal und das formale Äquivalent in Python. Das wäre die Lösung, die im Rahmen des Informatikunterrichts entwickelt bzw. erwartet würde.

Lösung (Pascal):

var k,n,summe:longint;
begin
  write('Zahl eingeben: ');
  readln(n);
  summe:=0;
  for k:=1 to n do begin
    summe:=summe+k
  end;	
  writeln('1+..+',n,' = ',summe);
end.

Lösung (Python):

n = int(input("Zahl eingeben: "))
summe = 0
for k in range(n+1):
    summe += k
print("1+..+",n,"=",summe)

Beide Programme werden (ggf. innerhalb einer eingesetzten Entwicklungsumgebung) im Terminal ausgeführt. Den Ablauf des Programms – für den Anwender sehen beide gleich aus – kann man sich hier im (simulierten) Terminalfenster selbst ansehen:


 



Functional Power

An diesem – simplen – Beispiel lässt sich zugleich auch wenigstens ansatzweise aufzeigen, wie elegant und knapp sich manche Problemstellung in Python lösen lässt. In dem Fall liegt das an den Elementen der „funktionalen Programmierung“, die Python (als primär imperative und objektorientierte Sprache) standardmäßig mitbringt. Das Paradigma der funktionalen Programmierung ist für den Informatikunterricht in der Mittelstufe allerdings nicht relevant, die beiden nachfolgend gezeigten Quelltexte gehen also über den Unterricht hinaus.

Lösung (nochmal Python):

n = int(input("Zahl eingeben: "))
print("1+..+",n,"=",sum(range(n+1)))

Mit Python 3.8 wurden so genannte „Zuweisungsausdrücke“ („Assignment Expressions“) neu eingeführt. Damit lässt sich das Beispielprogramm sogar als Einzeiler schreiben, und zwar als echter Einzeiler ohne Semikolon, der faktisch nur aus einem einzigen Funktionsaufruf der print()-Funktion besteht:

print("1+..+",n:=int(input("Zahl eingeben: ")),"=",sum(range(n+1)))

Vom Terminal zur GUI

Die neue Programmiersprache für den Informatikunterricht schien mit Python also gefunden. Zumindest solange man sich auf das EVA-Prinzip beschränkt – „Eingabe - Verarbeitung - Ausgabe", und zwar über das Terminal. Das kann Pascal auch. Etwas weniger elegant, aber im Ergebnis vergleichbar.

Die „neue“ Programmiersprache sollte aber ja gerade den Mangel von Pascal im Bereich einer zeitgemäßeren Anwenderinteraktion beheben. Was hat Python da zu bieten?

Viel. Es gibt mehrere GUI-Toolkits, die auf Python aufsetzen und mit denen sich auch komplexe GUI-Anwendungen umsetzen lassen – wie etwa der von mir entwickelte Modell­rechner MOPS:

Besonders attraktiv ist Tkinter. Nicht, weil es die umfangreichste Ausstattung an GUI-Elementen („Widgets“) mitbringt oder optisch besonders ansprechend ist. Verglichen etwa mit PyQt oder Kivy ist eher das Gegenteil der Fall. Attraktiv ist Tkinter, weil es zur Standardbibliothek von Python gehört und somit sofort einsatzbereit ist. Und der Quelltext bleibt – verglichen mit allen anderen mir bekannten GUI-Toolkits – relativ übersichtlich. Aber eben auch nur „relativ“.

Nach gründlicher Beschäftigung und reichlich Experimentieren mit Tkinter lautete mein Fazit:
Für den Einsatz im Informatikunterricht der Mittelstufe ist selbst Tkinter zu komplex. Trotz seiner relativen Schlichtheit würde der Einsatz dieses GUI-Toolkits dem Erlernen der wesentlichen Elemente der Programmierung im Wege stehen. Es droht zu viel „copy & paste“ und zu wenig „echte Programmierung“.

Was also tun?

Python mit ohne Schildkröte

Zur Standard-Bibliothek von Python gehört das Modul turtle. Es handelt sich dabei die Adaption der so genannten Turtle-Grafik der Programmiersprache Logo, die Ende der 60er Jahre des letzten Jahrhunderts als spezielle Lernsprache für Kinder entwickelt wurde: Eine „Schildkröte“ (engl. turtle) in Gestalt eines kleinen Dreiecks wird mittels eines minimalen Befehlssatzes in einem Zeichenfenster bewegt (relative Bewegungen und Drehungen) und kann durch „heben“ und „senken“ eines „Stiftes“ dabei Zeichnungen erstellen.

Die Idee der Turtle-Grafik ist aus meiner Sicht für die (graphische) Programmierung im Rahmen des Informatikunterrichts tatsächlich interessant, weil entsprechende Programmieraufgaben bzw. die Problemlösungen auch das geometrische Vorstellungsvermögen schulen. Nun war allerdings zum Zeitpunkt meiner Suche nach einer neuen Programmiersprache Python 2.5 die aktuelle Version und das dort enthaltene turtle-Modul war in seinen Möglichkeiten derart eingeschränkt, dass man mehr als ein paar Spielereien mit unansehnlichem Ergebnis damit nicht machen konnte.

Fazit: Die Schildkrötenidee ist gut, das von Python (2.5) angebotene turtle-Modul aber für ernsthafte Programmierung selbst für den Informatikunterricht der Mittelstufe leider völlig unbrauchbar. Es musste also eine andere Lösung gefunden werden ...

Python mit Frosch

Diese Lösung bestand letztlich darin, für den Einsatz im Unterricht ein eigenes Modul zu entwickeln, das auf dem turtle-Grafik-Konzept basiert, dieses aber durch eine erheblich erweiterte Funktionalität und eine konsequent objektorientierte Realisierung unterrichts­tauglich macht: Das frog-Modul.