Estoy de acuerdo, es más como un 'elif no [condición (s) elevando el descanso]'.
Sé que este es un hilo viejo, pero estoy investigando la misma pregunta en este momento, y no estoy seguro de que alguien haya captado la respuesta a esta pregunta en la forma en que la entiendo.
Para mí, hay tres formas de "leer" las declaraciones o else
in , todas las cuales son equivalentes, son:For... else
While... else
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)
(presumiblemente existe tal condición, o no tendría un bucle)
Entonces, esencialmente, el "else" en un bucle es realmente un "elif ..." donde '...' es (1) sin pausa, que es equivalente a (2) NOT [condición (s) que levanta la pausa].
Creo que la clave es que no else
tiene sentido sin el 'descanso', por lo que for...else
incluye:
for:
do stuff
conditional break # implied by else
else not break:
do more stuff
Entonces, los elementos esenciales de un for...else
bucle son los siguientes, y los leería en inglés simple como:
for:
do stuff
condition:
break
else: # read as "else not break" or "else not condition"
do more stuff
Como han dicho los otros carteles, generalmente se genera un descanso cuando puede localizar lo que está buscando su ciclo, por lo que el else:
convierte en "qué hacer si el elemento objetivo no se encuentra".
Ejemplo
También puede usar manejo de excepciones, pausas y bucles todos juntos.
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")
Resultado
x: 0
x: 1
x: 2
ASSERTION ERROR: x is 2
----------
# loop not completed (hit break), so else didn't run
Ejemplo
Ejemplo simple con un descanso siendo golpeado.
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")
Resultado
y: 0
y: 1
y: 2
BREAK: y is 2
----------
# loop not completed (hit break), so else didn't run
Ejemplo
Ejemplo simple donde no hay interrupción, no hay condición que provoque una interrupción y no se encuentre ningún error.
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")
Resultado
z: 0
z: 1
z: 2
z_loop complete without break or error
----------