Ich stimme zu, es ist mehr wie ein 'elif not [condition(s) raising break]'.
Ich weiß, dass dies ein altes Thema ist, aber ich beschäftige mich gerade mit der gleichen Frage, und ich bin mir nicht sicher, ob jemand die Antwort auf diese Frage so erfasst hat, wie ich sie verstehe.
Für mich gibt es drei Möglichkeiten, den Text zu "lesen" else
en For... else
o While... else
Anweisungen, die alle gleichwertig sind, sind:
else
==
if the loop completes normally (without a break or error)
else
==
if the loop does not encounter a break
else
==
else not (condition raising break)
(Vermutlich gibt es eine solche Bedingung, sonst gäbe es keine Schleife)
Im Wesentlichen ist das "else" in einer Schleife also ein "elif ...", wobei "..." (1) kein Abbruch ist, was (2) NICHT [Bedingung(en), die Abbruch auslösen] entspricht.
Ich denke, der Schlüssel ist, dass die else
ist ohne die "Unterbrechung" sinnlos, so dass eine for...else
umfasst:
for:
do stuff
conditional break # implied by else
else not break:
do more stuff
Wesentliche Elemente einer for...else
Die Schleifen lauten wie folgt, und in einfacherem Englisch lauten sie wie folgt:
for:
do stuff
condition:
break
else: # read as "else not break" or "else not condition"
do more stuff
Wie die anderen Poster bereits sagten, wird eine Unterbrechung in der Regel dann ausgelöst, wenn Sie in der Lage sind, das zu finden, wonach Ihre Schleife sucht, so dass die else:
wird zu "was ist zu tun, wenn das Zielobjekt nicht gefunden wird".
Beispiel
Sie können auch Ausnahmebehandlung, Pausen und for-Schleifen zusammen verwenden.
for x in range(0,3):
print("x: {}".format(x))
if x == 2:
try:
raise AssertionError("ASSERTION ERROR: x is {}".format(x))
except:
print(AssertionError("ASSERTION ERROR: x is {}".format(x)))
break
else:
print("X loop complete without error")
Ergebnis
x: 0
x: 1
x: 2
ASSERTION ERROR: x is 2
----------
# loop not completed (hit break), so else didn't run
Beispiel
Ein einfaches Beispiel mit einer Pause, die getroffen wird.
for y in range(0,3):
print("y: {}".format(y))
if y == 2: # will be executed
print("BREAK: y is {}\n----------".format(y))
break
else: # not executed because break is hit
print("y_loop completed without break----------\n")
Ergebnis
y: 0
y: 1
y: 2
BREAK: y is 2
----------
# loop not completed (hit break), so else didn't run
Beispiel
Einfaches Beispiel, bei dem keine Unterbrechung, keine Bedingung, die eine Unterbrechung auslöst, und kein Fehler auftritt.
for z in range(0,3):
print("z: {}".format(z))
if z == 4: # will not be executed
print("BREAK: z is {}\n".format(y))
break
if z == 4: # will not be executed
raise AssertionError("ASSERTION ERROR: x is {}".format(x))
else:
print("z_loop complete without break or error\n----------\n")
Ergebnis
z: 0
z: 1
z: 2
z_loop complete without break or error
----------