Python, eine gute Wahl als Unterrichtssprache

Teil 1: Die Grundlagen

 

0. Einleitung:

 

Eine ganz wesentliche Bemerkung hat Erich Neuwirth kürzlich in einer Diskussion im Kustodenforum gemacht, als er sagte, dass das erste Werkzeug im Programmierunterricht deswegen von hoher didaktischer Bedeutung ist, weil es den Denkstil prägt. Daran anknüpfend möchte ich nun zeigen, dass die Programmiersprache Python besonders gut als erstes Werkzeug geeignet ist.

 

Darüber hinaus ist sie als moderne objektorientierte Skriptsprache praktisch für den Unterricht der meisten Programmierkonzepte, die im EDV-Unterricht für 15 - 19 jährige sinnvoll behandelt werden können, außerordentlich gut geeignet.

 

Guido van Rossum, der Erfinder von Python schreibt über den Ursprung von Python: "Als ich Python erschuf habe ich es nicht eine Sprache für Lehrer entworfen: ich hatte ein Werkzeug für faule Programmierer wie mich vor Augen. Aber schon bald danach ... erfuhr ich von Programmierern, die ihren Kindern ... erfolgreich Python beibrachten. Das ist eigentlich gar nicht überraschend. Python verwendet viele Ideen von ABC, einer Lehrsprache, die zehn Jahre zuvor entstanden ist ..."

 

Ich möchte zunächst die didaktisch relevanten Vorzügen von Python zusammenfassen:

*) Python hat eine äußerst klare Syntax. Wesentliches Element ist, dass in Python Blöcke durch Einrückung (also durch "white space") definiert werden. Dies ist ein kontroversieller Zug, der jedoch dazu führt, dass Python-Programme gut strukturiert geschrieben werden müssen, damit sie funktionieren. Und daher auch jedenfalls leicht lesbar sind. Python wurde deshalb auch schon als "executable pseudocode" bezeichnet - im Gegensatz zu mancherorts
sehr verbreitetem "executable line-noise".

*) Python gestattet zwanglos die Anwendung unterschiedlichster Programmierstile - prozedural, funktional, objektorientiert, ... Der Programmierangfänger kann einfache Probleme mit kleinen simplen Programmen lösen, wie der Profi mit ganz fortgeschrittenen
Verfahren neue Klassenbibliotheken erstellen kann ...

 

*) Das obwohl Python von Anfang an (und nicht erst in Version 6, 7 oder wer weiß welcher) als objektorientierte Sprache konzipiert: "In Python ist alles ein Objekt". Dabei sind solche modernen Konzepte wie Operator-Überladung und Mehrfachvererbung realisiert.

*) Darüber hinaus stellt Python mit Listen und Dictionaries (Hash-Tables, assoziativen Feldern) äußerst leistungsfähige Datentypen, d. h. Klassen, bereit (von denen darüber hinaus
der Benutzer auch noch eigene Klassen ableiten kann!).

 

*) Python hat einen interaktiven Interpreter, der - ähnlich wie es in Logo oder Lisp funktioniert - hervorragend dazu geeignet ist, das Funktionieren der Sprache experimentell zu untersuchen. Das kommt enorm dem Forschungsdrang der SchülerInnen entgegen,
fördert deren Selbsttätigkeit (im Gegensatz zum (beinahe-)Abtippen von Programmen und führt darüber hinaus zu häufigen Erfolgs- erlebnissen. Der interaktive Interpreter eigenet sich auch hervorragend als "ad-hoc"-Werkzeug für Instant-Lösungen kleiner Problem.

*) Python kommt mit einer einfachen Entwicklungsumgebung namens IDLE mit Intrpreter im Direktmodus, Editor mit Syntax-colouring und einem ansehnlichen, aber einfach anzuwendenden Debugger.

*) Python kommt mit einem Toolkit zum Bau von GUI-Programmen: Tkinter. GUI's können sogar im "Direktmodus" Schritt für Schritt zusammengesetzt werden.

*) Python kommt mit einer leistungsfähigen Klassenbibliothek, die die einfache Konstruktion unterschiedlichster Objekte bis hin zu Webservern gestattet. Die Programmierung von Chat-Programmen oder Netzwerkspielen wird mit diesen Klassen zur relativ einfachen Übung.
Ebenso gibt es in dieser Bibliothek leistungsfähige Werkzeuge zur CGI-Programmierung. (Apache kann Python als Skriptsprache unterstützen).

*) Python kommt aber auch mit einem einfachen Turtle-Grafik-Modul, mit dem besonders die grundlegenden Programm-Konstrukte schön visualisiert werden können. (Diesen Weg habe ich im ersten Teil von "Python für Kids" beschritten.) Sie können auch mehrere Turtles
verwenden. Turtles sind zwar keine bunten Bälle, sie lassen sich aber dafür im Direktmodus Schritt für Schritt steuern (und brauchen keine Koordinaten-Geometrie). Scheinbarer Zeitverlust durch die Oberfläche tritt gar nicht erst auf.

*) Darüber hinaus gibt es zu Python eine Unzahl von "third-party" Modulen, mit denen einfach fortgeschrittene Anwendungen erstellt werden können. Beispielsweise Spiele mit dem "Pygame"-Modul oder 3D-Animationen mit "VPython".

*) Python ist plattform-unabhängig. Python-Programme laufen auf Windows-, Linux-, Mac-Systemen (wenn sie nicht spezielle systemspezifische Module verwenden.)

*) Mark Hammond hat eine Win32-Extension für Python geschrieben, mit der beispielsweise auf einfache Weise Microsoft-Office-Komponenten - etwa Spreadsheets - in Python - Programm eingebunden und genutzt werden können. Dieses Paket enthält eine zur IDLE alternative leistungsfähigere Entwicklungsumgebung für Windows.

*) All dies ist gratis und jedezeit für jeden in der neuesten Version mit vollständiger Dokumentation übers Internet erhätlich. Denn Python gehört (wie Linux) zum open-source-Bereich.

 

*) Mit Python landen Sie in einem nicht-kommerziellen sozialen Environment. Erstaunlich ist die gegenseitige Unterstützung, die Python-Anwender in verschiedenen mailing-listen einander leisten. Python-Tutor (tutor@python.org) ist ein besonders gutes Beispiel dafür,
das speziell für Neulinge, die Python lernen wollen gedacht ist. Die Erfahrung, Hilfe von Gleichgesinnten aus aller Herren Länder zu erhalten und diesen auch zurückzugeben kann meines Erachtens besonders für junge Leute von unschätzbarem Wert sein.

*) Die Entwicklung von Python als open-source-Produkt ist für jeden, der es wünscht, 100%ig transparent. Ich fand es sehr spannend, den Prozess zu verfolgen, in dem von zahllosen Mitgliedern der Python-Community Vorschläge für die Erweiterung und/oder Änderung der Sprache gemacht, öffentlich zur Diskussion gestellt und dann vom Entwicklerteam begründet angenommen oder abgelehnt wurden. (Jüngst wurde über einen bestimmten Punkt sogar eine öffentliche Abstimmung in der Python-Community durchgeführt.)

*) Probieren Sie es einmal aus - Sie werden sehen: "Have fun!" bleibt mit Python nicht nur ein Slogan.

 

Ich möchte Ihnen Python in einer fünfteiligen Serie vorstellen. Ich plane folgende Inhalte für die fünf Teile:

(a)    Die Grundlagen

(b)   Objekte in Python

(c)    GUI-Programmierung

(d)   Beispiele für Anwendungen der Klassenbibliothek

(e)    Python-Erweiterungen aus der open source community: Spiele, 3D-Programmierung, Jython, Python & Win32

 

1.     Getting started (Loslegen!)

 

In die heutigen Folge möchte ich Ihnen zunächst die Sprachgrundlagen soweit vorstellen, dass Sie Ihre Grundkenntnisse aus anderen Sprachen in Python übertragen können.

 

Die jeweils aktuellste Version (wenn Sie dies lesen vermutlich Python 2.3) können Sie von der Python-Website http://www.python.org herunterladen. Die wichtigsten Bestandteile des Python-Systems, die Sie nach der Installation vorfinden, sind der Python-Interpreter, die Entwicklungsumgebung IDLE und die Dokumentation im html-Format.

 

Um Python kennenzulernen, ist es am bequemsten, aus dem Statmenü Python|IDLE zu starten. Die IDLE meldet sich mit einem Shell-Fenster, das den interaktiven Python-Interpreter bereitstellt. Dieser meldet sich mit der Eingabeaufforderung

 

>>>

 

Er ist ideal dazu geeignet, Python zu erforschen. Sie können ihm beliebige Python-Ausdrücke oder Python-Anweisungen eingeben. Diese werden vom Interpreter sofort ausgewertet beziehungweise ausgeführt:

 

Abbildung 1

 

2.     Einfache Datentypen

 

Wir sehen hier die numerischen Datentypen int, long und float in Verwendung sowie den Datentyp string. Um "höhere mathematische Operationen" auszuführen, müssen diese aus dem Modul math importiert werden. Dies geschieht mit der import-Anweisung: hier wird die sqrt-Funktion importiert. from math import * importiert alle Funktionen aus dem Modul math.

Um herauszufinden, was ein Modul enthält ruft man den Menüeintrag Help|Python Documentation … auf und klickt zunächst auf den Link Global Module Index, dann auf den Namen des gewünschten Moduls: math. Man erhält eine Liste der enthaltenen Funktionen.

 

Aufschluß über den Typ von Python-Objekten gibt die eingebaute Funktion type:

 

>>> type(1)

<type 'int'>

>>> type(1.0)

<type 'float'>

>>> type(301**20)

<type 'long'>

Darüber hinaus gibt es in Python auch noch den numerischen Datentyp complex.

>>> (3+2j)*(1-1j)

(5-1j)

 

Als arithmetische Operatoren gibt es +, -, *, /, // und % (modulo-Operation). Bezüglich der Ergebnisse von Divisionen ist zu beachten, dass in der aktuellen Version von Python / als Ganzzahl-Division arbeitet, wenn beide Operanden ganzzahlig sind:

 

>>> 17 / 3

5

>>> 17.0 / 3

5.666666666666667

>>> 17 // 3

5

>>> 17 % 3

2

 

Variablen müssen (und können) in Python nicht deklariert werden und werden durch Wertzuweisungen mittels des Zuweisungsoperators = erzeugt. Mehrfache Zuweisungen in einer Anweisung sind möglich:

 

>>> a = 14

>>> b, c, d = 3.0, 4.0, a / 2.0

>>> d

7.0

>>> a, b, c

(14, 3.0, 4.0)

 

3.     Sequenzen

 

Python kennt drei Datentypen, die als Sequenzen bezeichnet sind, und deren Elemente durch ganze Zahlen indiziert werden können. Strings, Listen und Tupel Die Indizierung beginnt immer mit 0:

 

>>> wort = "Python"

>>> wort[0]

'P'

>>> len(wort)

6

>>> woerter = ["a", "be", "bu", "und", "draußt", "bist", "du"]

>>> woerter[2]

'bu'

>>> len(woerter)

7

>>> zahlen = (1, 1.0/2, 9.999)

>>> len(zahlen)

3

>>> zahlen[1]

0.5

 

Nur Listen können, z. B. durch Zuweisung an Elemente verändert werden:

 

>>> woerter[4] = "drin"

>>> woerter

['a', 'be', 'bu', 'und', 'drin', 'bist', 'du']

>>> zahlen[1] = 2.0

Traceback (most recent call last):

  File "<pyshell#21>", line 1, in ?

    zahlen[1] = 2.0

TypeError: object doesn't support item assignment

 

Spezielle Listen ganzer Zahlen werden durch die eingebaute Funktion range erzeugt:

 

>>> range(5)

[0, 1, 2, 3, 4]

>>> range(4,7)

[4, 5, 6]

>>> range(2,13,3)

[2, 5, 8, 11]

 

  1. Kontrollstrukturen

 

Über die Elemente eine Sequenz kann mit der for-Schleife iteriert warden:

 

>>> for zahl in range(4):

        quadrat = zahl ** 2

        print zahl, "zum Quadrat ist", quadrat

 

 

0 zum Quadrat ist 0

1 zum Quadrat ist 1

2 zum Quadrat ist 4

3 zum Quadrat ist 9

 

Diese Beispiel zeigt die allgemeine Struktur zusammengesetzter Anweisungen, also von Anweisungen die einen Block von zusammengehörigen Anweisungen enthalten.

 

In Python wird ein Block nicht durch Klammern oder Schlüsselwörter wie begin/end gekennzeichnet, sondern indem die zum Block gehörigen Anweisungen gleich weit eingerückt werden. In Python hat also leerer Raum ("white space") syntaktische Funktion!

Dies führt notwendigerweise zu klar strukturierten Programmen. Die IDLE kennt Pythons Syntax und schlägt daher passende Einrückungen vor.

 

Die for-Anweisung führt den Schleifenblock für jedes Element der Sequenz aus. Der Kopf der Schleife muß, wie jeder Kopf einer zusammengesetzten Anweisung durch einen Doppelpunkt abgeschlossen werden. Ein weiteres Beispiel, das gleich auch eine Anwendung der if-Anweisung zeigt:

 

>>> for wort in woerter:

        if 2<=len(wort)<=3:

                print wort,

 

be bu und du

 

Die if-Anweisung kennt auch optionale else-if-Zweige, in Python durch das Schlüsselwort elif gekennzeichnet, und einen optionalen else-Zweig.

 

Wir zeigen das, indem wir nun ein erstes Python-Programm, ein Script, schreiben. Dazu öffnen wir von der IDLE aus ein neues Fenster über File|New window und schreiben folgenden Text hinein:

 

from math import sqrt

 

print "Loesung quadratischer Gleichung:"

a, b, c = input("Koeffizienten: ")

determinante = b**2 - 4*a*c

if determinante > 0:

    d = sqrt(determinante)

    x1, x2 = (-b+d)/(2.0*a), (-b-d)/(2.0*a)

elif determinante == 0:

    x1 = x2 = -b/(2.0*a)

else:

    x1, x2 = "unloesbar!", ""

print "Loesungen", x1, x2

 

Dann speichern wir diesen Text als Datei unter dem Namen quagl.py ab und führen im Editor-Fenster den Menübefehl Edit|Run script aus. Dies führt etwa zu folgendem Dialog im Shell-Fenster:

 

>>>

Loesung quadratischer Gleichung:

Koeffizienten: 4, -8, 3    # Kursiv: Benutzereingabe

Loesungen 1.5 0.5

 

>>>

 

Erläuterungen:

-         die eingebaute Funktion input() dient der Eingabe von Python-Ausdrücken. Zahlen, aber auch Tupel wie 4, -8, 3 sind gültige Python-Ausdrücke.

-         die Einrückung der "Blöcke" in der if-elif-else-Anweisung. Zwei davon bestehen nur aus einer einzigen Anweisung.

-         der if-Block und der else-Block enthalten eine Parallel-Zuweisung, der andere Blocke enthält eine mehrfache Zuweisung.

-         Prüfung auf Gleichheit geschieht mit ==, fortlaufende Vergleiche wie 2<=len(wort)<=3 sind möglich.

 

5.                 Funktionsdefinitionen

 

Funktionsdefinitionen werden in Python mit dem Schlüsselwort def eingeleitet. Funktionen können natürlich Parameter haben und daher Argumente übernehmen. Wie probieren wieder ein ganz einfaches Beispiel mit dem Interpreter aus. Achten Sie wieder auf die gleichmäßige Einrückung des Funktionsblocks:

 

>>> def doppelt(x):

        d = 2 * x

        print "Das Doppelte von", x, "ist", d

 

 

>>> doppelt(5)

Das Doppelte von 5 ist 10

 

doppelt funktioniert wie eine Prozedur. Angemessener ist hier vielleicht ein "echte" Funktion mit Rückgabewert. Dazu benötigen wir die return-Anweisung:

 

>>> def doppelt(x):

        return 2 * x

 

>>> doppelt(5)

10

>>> doppelt(doppelt(5))

20

 

Der letzte Aufruf wäre natürlich mit der ersten "Prozedur"-Version nicht möglich gewesen.

 

Nützen wir diese Möglichkeit, um unser Script für die Lösung quadratischer Gleichungen zu ändern, indem wir eine Funktion zu definieren. (Im Edit-Fenster hilft dabei Edit|Indent region.)

 

 from math import sqrt

def quagl(a,b,c):

    determinante = b**2 - 4*a*c

    if determinante > 0:

        d = sqrt(determinante)

        return (-b+d)/(2.0*a), (-b-d)/(2.0*a)

    elif determinante == 0:

        return -b/(2.0*a)

    else:

        return ()

 

Nun können wir quadratische Gleichungen mittels Funktionsaufrufen lösen:

 

>>> quagl(4,-8,3)

(1.5, 0.5)

>>> quagl(1,2,1)

-1.0

>>> quagl(1,0,4)

()

 

Dabei sehen wir, dass Python-Funktionen mehrere Werte (als Tupel) zurückgeben können.

 

Neben der for-Schleife kennt Python auch die while-Schleife, deren Syntax nach dem bisher gesagten eigentlich keiner weiteren Erläuterung bedarf. Sie lässt sich beispielsweise im Euklidischen Algorithmus für die Berechnung des größten gemeinsamen Teilers zweier Zahlen anwenden. Mittels Parallelzuweisung lässt sich der in Python sehr elegant formulieren.

 

>>> def ggt(a,b):

        while b>0:

            a,b = b,a%b

        return a

 

>>> ggt(105, 42)

21

 

6.                 Funktionen als Objekte

 

Zuletzt möchte ich noch zeigen, dass sich Funktionen (in Python sind Funktionen auch Objekte) als Argumente an andere Funktionen übergeben lassen:

 

>>> def tabelle(von, bis, fun):

        for x in range(von,bis+1):

                print x, fun(x)

 

>>> tabelle(13,16,doppelt)

13 26

14 28

15 30

16 32

>>> def cubus(n):

        return n**3

 

>>> tabelle(27,29,cubus)

27 19683

28 21952

29 24389

>>>

 

In der nächsten Folge möchte ich zeigen, was die Feststellung bedeutet: "In Python ist alles ein Objekt", und etwas OOP treiben: wie man in Python selbst Klassen definieren und Objekte erzeugen kann.

 

7.                 Quellen

Wenn Sie sich etwas näher mit Python beschäftigen möchten, können Sie dafür viele Ressourcen in Anspruch nehmen.

(1)               Vielfältig und gratis ist alles, worauf auf der Python-Website "for beginners" verwiesen wird: http://www.python.org/doc/Newbies.html. Für das meiste davon ist halt Englisch erforderlich.

(2)                An deutschsprachigen Büchern bieten sich an:

-                                       Mark Lutz und David Ascher: Einführung in Python, OReilly, 2000 (Englische Neuauflage in Vorbereitung.)

-                                       Gregor Lingl: Python für Kids, mitp, 2003. Gedacht als Einführung ins Programmieren für Anfänger, unter Verwendung von Python. Siehe dazu auch: http://python4kids.net

-                                       von Löwis/Fischbeck: Python 2, Addison-Wesley, 2001. Ist keine Einführung, sondern anspruchsvoll und tiefergehend, enthält aber noch nicht die Neuerungen von Python seit Version 2.1.

(3)               Für Ambitionierte dürfte derzeit am aktuellsten und ergiebigsten sein: Alex Martelli: Python in a Nutshell, OReilly, 2003. (Englisch)