Sono d'accordo, è più come un 'elif non [condizione (s) innalzamento pausa]'.
So che questo è un vecchio thread, ma sto esaminando la stessa domanda in questo momento, e non sono sicuro che qualcuno abbia catturato la risposta a questa domanda nel modo in cui la capisco.
Per me, ci sono tre modi di "leggere" le istruzioni else
in For... else
o While... else
, tutte equivalenti, sono:
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)
(presumibilmente esiste una tale condizione, o non avresti un ciclo)
Quindi, in sostanza, l '"altro" in un ciclo è in realtà un "elif ..." dove' ... 'è (1) nessuna interruzione, che equivale a (2) NOT [condizione (e) innalzamento dell'interruzione].
Penso che la chiave sia che else
è inutile senza la "rottura", quindi un for...else
include:
for:
do stuff
conditional break # implied by else
else not break:
do more stuff
Quindi, gli elementi essenziali di un for...else
ciclo sono i seguenti, e li leggeresti in un inglese più semplice come:
for:
do stuff
condition:
break
else: # read as "else not break" or "else not condition"
do more stuff
Come hanno detto gli altri poster, in genere viene generata una pausa quando si è in grado di individuare ciò che il proprio loop sta cercando, quindi il else:
diventa "cosa fare se l'oggetto target non si trova".
Esempio
Puoi anche usare la gestione delle eccezioni, le interruzioni e per i loop tutti insieme.
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")
Risultato
x: 0
x: 1
x: 2
ASSERTION ERROR: x is 2
----------
# loop not completed (hit break), so else didn't run
Esempio
Esempio semplice con una pausa colpita.
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")
Risultato
y: 0
y: 1
y: 2
BREAK: y is 2
----------
# loop not completed (hit break), so else didn't run
Esempio
Semplice esempio in cui non vi sono interruzioni, nessuna condizione che genera un'interruzione e nessun errore.
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")
Risultato
z: 0
z: 1
z: 2
z_loop complete without break or error
----------