Arbeit mit Schleifen wiederholen
Wenn eine Schleife nie endet
Eine for-Schleife über eine feste, endliche Sammlung endet, wenn keine Elemente mehr übrig sind. Solche for-Schleifen hast du bisher geschrieben.
Eine while-Schleife verspricht das nicht. Sie endet, wenn ihre Bedingung False wird, und nichts erzwingt das. Bleibt die Bedingung für immer True, wiederholt sich die Schleife für immer. Das ist eine Endlosschleife, und jeder Programmierer schreibt irgendwann eine.
Diese Lektion zeigt, wie du sie erkennst, beendest und verhinderst. Die Beispiele hier sind absichtlich fehlerhaft. Lies sie, statt sie auszuführen. Auf dieser Seite gibt es keine Run-Schaltflächen.
Der Klassiker: Nichts ändert sich
count = 3
while count > 0:
print(count)
Die Bedingung fragt nach count. Der Rumpf verändert count nie. Es bleibt immer 3, die Bedingung bleibt immer True, und Python gibt weiter 3 aus, bis etwas außerhalb des Programms es stoppt.
Bei diesem Countdown fehlt die Zeile, die count verringert.
Der unauffällige Fall: Änderung in die falsche Richtung
count = 3
while count > 0:
print(count)
count = count + 1
Hier ändert sich count, deshalb wirkt die Schleife auf den ersten Blick vollständig. Es bewegt sich aber in die falsche Richtung. count steigt über 4, 5, 6 hinaus und entfernt sich mit jedem Durchlauf weiter vom Ende.
Lies die Bedingung und die Aktualisierung gemeinsam als Paar. Die Bedingung sagt, dass die Schleife endet, wenn count den Wert 0 erreicht. Die Aktualisierung muss count also in Richtung 0 bewegen.
Der versteckte Fall: Die Aktualisierung steckt in einem if fest
attempts = 0
answer = "no"
while answer == "no":
attempts += 1
if attempts > 10:
answer = "yes"
print("Finally")
Diese Schleife endet tatsächlich. Ändere die Bedingung innerhalb von if, und die Aktualisierung wird nie erreicht:
attempts = 0
answer = "no"
while answer == "no":
attempts += 1
if attempts < 0:
answer = "yes"
print("Finally")
Die Versuchsanzahl beginnt bei null und steigt. Deshalb ist attempts < 0 nie wahr. Die Zeile, die answer ändert, existiert, aber Python erreicht sie nie. Wenn die Aktualisierung einer Bedingungsvariablen innerhalb eines if steht, frage dich, ob dieses if wahr werden wird.
Vergleiche die drei Wege unten: Einer bewegt die Bedingung in Richtung False, einer macht keinen Fortschritt, und einer entfernt sich weiter davon. Achte besonders auf die Pfeile.
Im Diagramm ist count -= 1 die kürzere Form von count = count - 1, genauso wie count += 1 eins addiert. ENDS bedeutet „endet“, NO PROGRESS „kein Fortschritt“, WRONG WAY „falsche Richtung“ und no update „keine Aktualisierung“. FALSE/STOP bedeutet „falsch/stoppen“, TRUE FOREVER „für immer wahr“ und UPDATE TOWARD FALSE „so ändern, dass die Bedingung falsch wird“.

Was auf Python Land passiert
Falls du doch eine solche Schleife ausführst, stoppe sie und prüfe die Bedingung und die Aktualisierung vor dem nächsten Versuch. Was du siehst, hängt davon ab, wo die Lektion läuft.
In einer Browser-Lektion läuft dein Code in einem Worker innerhalb der Seite. Die Ausgabe wird während der Ausführung fortlaufend angezeigt. Eine ausgebende Endlosschleife kann das Terminal deshalb schnell füllen. Eine Schleife ohne print() kann still wirken. Nach einigen Sekunden erscheint über dem Editor eine Warnung:
⚠ This does not look like it is finishing.
Daneben steht eine Schaltfläche Stop. Klicke darauf. Das Terminal erklärt, dass das Programm möglicherweise eine Endlosschleife enthält oder einfach viel mehr Arbeit erledigt als erwartet.
Beim Stoppen wird Python im Hintergrund neu gestartet. Deshalb braucht der nächste Lauf einen Moment länger zum Anlaufen. Dein Code im Editor bleibt unverändert.
Der Debugger verwendet eine andere Sicherheitsgrenze. Er zeichnet höchstens 1.000 Trace-Ereignisse auf und zeigt dir dann das Ergebnis. Bei einer Endlosschleife öffnet er eine gekürzte Aufzeichnung, statt die Seite aufzuhängen. Du kannst die wiederholten Zeilen und veränderten Variablen untersuchen und dann mit Stop in der Debugger-Werkzeugleiste aussteigen. Ein Neuladen der Seite ist nicht nötig.
In einer Server-Lektion wird die Schaltfläche Run zu Stop, während dein Programm wartet oder arbeitet. Verwende sie, um einen festgefahrenen interaktiven Lauf zu beenden. Auch die Serverausführung hat Zeit- und Ausgabegrenzen. Eine interaktive Sitzung hat aber nicht dieselbe kurze Zeitgrenze wie eine Abgabe. Warte deshalb nicht darauf, dass sie von selbst stoppt.
Ein Zeitlimit oder diese Stop-Warnung in einer Lektion, die schnell fertig sein sollte, ist ein deutlicher Hinweis auf eine nicht endende Schleife. Das ist eine Information, kein Tadel.
Prüfe eine while-Schleife vor dem Ausführen
Drei Fragen, in dieser Reihenfolge:
Nach welcher Variablen fragt die Bedingung?
Welche Zeile im Rumpf verändert diese Variable?
Bewegt diese Änderung die Variable in Richtung Schleifenende?
Wenn du für Frage 2 keine Zeile zeigen kannst, hast du den Fehler bereits vor dem Ausführen gefunden. Das dauert wenige Sekunden und erspart dir einen abgebrochenen Lauf.
Manchmal ist eine while-Schleife schlicht das falsche Werkzeug. Wenn du einmal pro Element einer festen, endlichen Sammlung wiederholst und die Schleife die Sammlung nicht erweitert, endet eine for-Schleife, sobald die Elemente aufgebraucht sind. Sie braucht dafür keinen Zähler.
Schleifen, die absichtlich unbegrenzt laufen
Nicht jede Endlosschleife ist ein Fehler. Das kommt in echten Programmen vor:
while True:
...
True ist kein Vergleich. Es ist einfach der boolesche Wert True, deshalb kann die Bedingung nicht von selbst False werden. Programme, die auf Eingaben warten oder ein Menü bis zur ausdrücklichen Beendigung laufen lassen, werden oft so geschrieben.
Eine solche Schleife braucht einen bewussten Ausstieg aus dem Rumpf. Genau den liefert dir die nächste Lektion.
Welche dieser Schleifen endet nie?
total = 0
while total < 5:
print(total)
total = total - 1
Eine while-Schleife in deinem Programm wird nie fertig. Was solltest du zuerst prüfen?
Was du mitnehmen solltest
Eine Endlosschleife ist keine Katastrophe. Sie ist ein Fehler mit einem deutlichen Symptom, einer Möglichkeit zum Aussteigen und meist einer Korrektur von nur einer Zeile. Lerne die drei Fragen und verwende sie vor dem Ausführen einer while-Schleife. Dann verliert das Thema schnell seinen Schrecken.
Aufgabe
In dieser Lektion gibt es nichts auszuführen. Lies die fehlerhaften Beispiele sorgfältig und beantworte beide Fragen.
Prüfe vor dem Weitergehen, ob du erklären kannst:
warum eine
for-Schleife über eine feste, endliche Liste, die sie nicht erweitert, endet, während einewhile-Schleife ihre Bedingung für immer wahr halten kann;auf welche drei Arten eine
while-Schleife nicht endet: fehlende Aktualisierung, Änderung in die falsche Richtung und eine Aktualisierung in einemif, das nie wahr ist;was erscheint, wenn ein Browser-Programm nicht fertig wird, und was die Schaltfläche Stop tut;
wie Step eine Endlosschleife auf 1.000 aufgezeichnete Ereignisse begrenzt und dich die gekürzte Aufzeichnung untersuchen lässt;
welche drei Fragen du vor dem Ausführen einer
while-Schleife stellen solltest.