In Python kann man else nicht nur nach if, sondern auch nach den Schleifen for und while schreiben. Der Körper von else wird nur ausgeführt, wenn die Schleife "normal" beendet wurde — nicht durch break. Das ermöglicht eine elegante Implementierung, zum Beispiel die Suche nach einem Element.
Beispiel:
for x in range(5): if x == 3: print('break!') break else: print('Die Schleife wurde ohne break beendet') # wird nicht ausgeführt
for x in range(5): if x == 10: break else: print('Die Schleife wurde ohne break beendet') # wird ausgeführt
Dieses Feature wird oft verwendet, um "erfolglose Suchen" zu realisieren: Wenn kein break auftritt, wurde das Element nicht gefunden.
Wird der else-Block der Schleife immer ausgeführt, wenn die Schleife beendet wird? Was ist, wenn die Schleife leer war?
Antwort: Ja, wenn kein break aufgetreten ist, wird else immer ausgeführt, auch wenn die Schleife nie in den Körper eingetreten ist:
for x in []: print('nichts') else: print('else!') # das wird ausgegeben
Geschichte
Projekt: Dokumentenparser.
Problem: Wir haben nach einem Schlüssel in einer Liste gesucht und nach der Schleife ein Flag "not found" außerhalb von else gesetzt. Infolgedessen funktionierte die Erkennung des Elements nicht korrekt, wenn break nicht ausgelöst wurde.
Geschichte
Projekt: Generierung einzigartiger Token.
Problem: Die Logik zur Generierung des Tokens hing davon ab, dass korrekt durch break ausgegangen wurde, und else wurde fälschlicherweise als "außergewöhnlicher Fall" betrachtet, obwohl es in 99 % der Ausführungen eintrat, was die Benutzerautorisierung logik störte.
Geschichte
Projekt: Testscript für ein Netzwerk-API.
Problem: Aufgrund eines falschen Verständnisses von else nach while wurde es zur Verarbeitung von Zeitüberschreitungen verwendet, obwohl die Schleife nicht durch break beendet wurde, und die Zeitüberschreitungen wurden nicht erfasst, was zu "stillen" Fehlern in den Tests führte.