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:


Ablaufdiagramm einer 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 dieser Zähler und gegebenenfalls auch andere 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 dieses 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:

Einfache Beispiele von Schleifen

Das folgende Skript, das wir in der interaktiven Shell direkt eintippen können, gibt die Zahlen von 1 bis 10 aus:
>>> i = 1
>>> while i <= 10:
...      print(i)
...      i += 1
... 
1
2
3
4
5
6
7
8
9
10
>>> 

Mit dem nächsten kleinen Python-Skript berechnen wir die Summe der Zahlen von 1 bis 100. In ähnlicher Form würde man es auch in C, C++ oder Java machen. Allerdings geht es in Python deutlich einfacher, wie wir im folgenden Kapitel sehen werden.

n = 100

sum_of_numbers = 0
i = 1
while i <= n:
    sum_of_numbers += i
    i += 1

result = "Summe von 1 bis " + str(n) + ": " + str(sum_of_numbers)
print(result)

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:

Sie stehen im Modul sys als zur Verfügung.

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 input(prompt) einlesen.
>>> name = input("Wie heißen Sie?\n")
Wie heißen Sie?
Tux
>>> print(name)
Tux
>>> 

Der else-Teil

Ablaufdiagramm einer Schleife mit else-TeilWie 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

Ablaufdiagramm einer Schleife mit else und break Normalerweise wird eine while-Schleife nur beendet, wenn die Bedingung im Schleifenkopf nicht mehr erfüllt ist. Mit break kann man aber eine Schleife vorzeitig komplett verlassen. Mit 'continue' beendet man lediglich einen Durchlauf, d.h. man kehrt zum Schleifenkopf, also zur Überprüfung der Bedingung, zurück.
Im folgenden Beispiel, einem einfachen Zahlenratespiel, kann man 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 = random.randint(1,n)

guess = 0
while guess != to_be_guessed:
    guess = int(input("Neuer Versuch: "))
    if guess > 0:
        if guess > to_be_guessed:
            print("Zu gross")
        elif guess < to_be_guessed:
            print("Zu klein")
    else:
        print("Schade, dass du aufgibst!")
        break
else:
    print("Gratuliere, das war's")

Die Ausgabe einer Spielsitzung könnte beispielsweise so aussehen:
$ python3 number_game.py 
Dein/Ihr Versuch: 10
Zu klein
Dein/Ihr Versuch: 15
Zu klein
Dein/Ihr Versuch: 18
Gratuliere, das war's
$