Eu concordo, é mais como um 'elif not (condição (s) que aumenta o intervalo]'.
Sei que esse é um tópico antigo, mas estou analisando a mesma pergunta agora e não tenho certeza de que alguém tenha capturado a resposta para essa pergunta da maneira que eu a entendo.
Para mim, existem três maneiras de "ler" as instruções else
in For... else
ou While... else
, todas equivalentes, são:
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)
(presumivelmente existe essa condição ou você não teria um loop)
Portanto, essencialmente, o "else" em um loop é realmente um "elif ..." onde '...' é (1) sem interrupção, o que equivale a (2) NOT [condição (s) que aumenta a interrupção].
Eu acho que a chave é que isso else
é inútil sem o 'intervalo', então a for...else
inclui:
for:
do stuff
conditional break # implied by else
else not break:
do more stuff
Portanto, os elementos essenciais de um for...else
loop são os seguintes, e você os leria em inglês mais claro como:
for:
do stuff
condition:
break
else: # read as "else not break" or "else not condition"
do more stuff
Como os outros pôsteres disseram, geralmente ocorre uma interrupção quando você é capaz de localizar o que seu loop está procurando, else:
tornando - se "o que fazer se o item de destino não estiver localizado".
Exemplo
Você também pode usar manipulação de exceção, quebras e loops 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
Exemplo
Exemplo simples com uma quebra sendo atingida.
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
Exemplo
Exemplo simples em que não há interrupção, nenhuma condição que gera uma interrupção e nenhum erro é encontrado.
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
----------