Schleifen
Allgemeiner Aufbau einer Schleife
Schleifen, werden benötigt, um einen Codeblock, den man auch als Schleifenkörper
bezeichnet wiederholt auszuführen. In Python gibt es zwei Schleifentypen:
die while-Schleife und die for-Schleife.
Die meisten Schleifen enthalten einen Zähler oder ganz allgemein Variablen, die im Verlauf der
Berechnungen innerhalb des Schleifenkörpers ihre Werte ändern. Außerhalb, d.h. noch vor
dem Beginn der Schleife, werden diese Variablen initialisiert. Vor jedem Schleifendurchlauf
wird geprüft, ob ein Ausdruck, in dem diese Variable oder Variablen vorkommen, wahr ist.
Dieser Ausdruck bestimmt das Endekriterium der Schleife. Solange die Berechnung dieses
Ausdrucks "True" liefert wird der Rumpf der Schleife ausgeführt. Nachdem alle Anweisungen des Schleifenkörpers durchgeführt worden sind, springt die Programmsteuerung automatisch zum Anfang der Schleife, also zur Prüfung des Endekriteriums zurück und prüft wieder, ob diese nochmals erfüllt ist.
Wenn ja, geht es wie oben beschrieben weiter, ansonsten wird der Schleifenkörper
nicht mehr ausgeführt und es wird mit dem Rest des Skriptes fortgefahren.
Das nebenstehende Diagramm zeigt dies schematisch.
Ganz allgemein unterscheidet man drei verschiedene Schleifentypen in Programmiersprachen:
- Zähler-kontrollierte Schleifen
Ein Programmkonstrukt, mit dem der Schleifenkörper unter der Kontrolle einer Zählervariablen eine bestimmte Anzahl von Malen durchlaufen wird. Dies entspricht der for-Schleife, wie wir sie in C bzw. C++ vorfinden. Python kennt nicht diesen Schleifentyp.
for (i=0; i <= n; i++) - Bedingungs-kontrollierte Schleifen
Eine Schleife wird solange wiederholt bis sich eine Bedingung ändert, also solange eine Bedingung z.B. wahr ist. Es gibt while-Schleifen und Do-While-Schleifen, die dieses Verhalten haben. - Sammlung-kontrollierte Schleifen
Mit Sammlung meinen wir Listen, Arrays oder sonstige Anordnungen von Objekten. Über die Elemente einer solchen Sammlung wird mittels einer Schleife iteriert. Diese Schleifen werden meistens eingeleitet mit dem Schlüsselwort "foreach", aber auch mit "for" wie in Python. Wohl eines der bekanntesten Vertreter dieser "Gattung" liefert die Bashshell:
for i in *, do echo $i; done
Einfaches Beispiel einer Schleife
Wir möchten dies nun an einem kleinen Python-Skript verdeutlichen, was
die Summe der Zahlen von 1 bis 100 bildet. Später werden wir weitaus elegantere
Möglichkeiten zu diesem Zweck kennenlernen.
#!/usr/bin/env python3
n = 100
sum = 0
i = 1
while i <= n:
sum = sum + i
i = i + 1
print("Summe von 1 bis %d: %d" % (n,sum))
Standard-Eingabe lesen
>Bevor wir mit der while-Schleife weitermachen, müssen wir noch ein paar
grundsätzliche Dinge über die Standardeingabe und die Standardausgabe klären.
Als Standardeingabe gilt normalerweise die Tastatur. Die meisten Shell-Programme
schreiben ihre Ausgaben in die Standardausgabe, d.h. das Terminalfenster oder die
Textkonsole. Fehlermeldungen werden in die Standard-Fehlerausgabe ausgegeben, was
üblicherweise auch dem aktuellen Terminalfenster oder der Textkonsole entspricht.
Auch der Python-Interpreter stellt drei Standard-Dateiobjekte zur Verfügung:
- Standardeingabe
- Standardausgabe
- Standardfehlerausgabe
- sys.stdin
- sys.stdout
- sys.stderror
Das folgende Beispiel-Skript zeigt nun, wie man Zeichen für Zeichen mittels einer while-Schleife von der Standardeingabe (Tastatur) einliest. Mit dem import-Befehl wird das benötigte Modul sys eingelesen.
import sys
text = ""
while 1:
c = sys.stdin.read(1)
text = text + c
if c == '\n':
break
print("Eingabe: %s" % text)
Eleganter kann man eine beliebige Eingabezeile von der Standardeingabe
natürlich mit der Funktion raw_input(prompt) einlesen.
>>> name = input("Wie heißen Sie?\n")
Wie heißen Sie?
Tux
>>> print(name)
Tux
>>>
Der else-Teil
Wie auch die bedingte if-Anweisung hat die while-Schleife in Python im Gegensatz zu anderen Programmiersprachen einen optionalen else-Zweig, was für viele Programmierer gewöhnungsbedürftig ist.
Die Anweisungen im else-Teil werden ausgeführt, sobald die Bedingung nicht mehr erfüllt ist. Sicherlich fragen sich einige nun, worin dann der Unterschied zu einer normalen while-Schleife liegt. Hätte man die Anweisungen nicht in den else-Teil gesteckt sondern einfach hinter die while-Schleife gestellt, wären sie ja auch genauso ausgeführt worden. Es wird erst mit einem break-Kommando, was wir später kennenlernen sinnvoll.
Allgemein sieht eine while-Schleife mit else-Teil in Python wie folgt aus:
while Bedingung: Anweisung1 ... Anweisungn else: Anweisung1 ... Anweisungn
Vorzeitiger Abbruch einer while-Schleife
Normalerweise wird eine Schleife nur beendet, wenn die Bedingung im Schleifenkopf erfüllt ist.
Mit break kann man aber eine Schleife vorzeitig verlassen und mit continue einen Durchlauf beenden.
Im folgenden Beispiel, einem einfachen Zahlenratespiel, kann kam erkennen, dass in Kombination mit
einem break der else-Zweig durchaus sinnvoll sein kann. Nur wenn die while-Schleife regulär beendet wird,
d.h. der Spieler die Zahl erraten hat, gibt es einen Glückwunsch. Gibt der Spieler auf, d.h. break,
dann wird der else-Zweig der while-Schleife nicht ausgeführt.
import random
n = 20
to_be_guessed = int(n * random.random()) + 1
guess = 0
while guess != to_be_guessed:
guess = int(input("New number: "))
if guess > 0:
if guess > to_be_guessed:
print("Number too large")
else:
print("Number too small")
else:
print("Sorry, that you're giving up!")
break
else:
print("Congratulation. You made it!")
Die Ausgabe einer Spielsitzung könnte beispielsweise so aussehen:
$ python3 number_game.py New number: 12 Number too small New number: 15 Number too small New number: 18 Number too large New number: 17 Number too small Congratulation. You made it! $

