Я согласен, это больше похоже на 'elif not [условие (и), поднимающее разрыв]'.
Я знаю, что это старая тема, но я смотрю на ту жевопрос прямо сейчас, и я не уверен, что кто-то получил ответ на этот вопрос так, как я его понимаю.
Для меня есть три способа «прочитать» else
в 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)
(предположительно, есть такое условие, или у вас не будет цикла)
Так что, по сути, «другое» вцикл - это действительно "elif ...", где '...' - это (1) без перерыва, что эквивалентно (2) НЕ [условию (ам), поднимающему разрыв].
Я думаю, что ключ в том, что else
бессмысленно без 'перерыва', поэтому for...else
включает в себя:
for:
do stuff
conditional break # implied by else
else not break:
do more stuff
Итак, основные элементы цикла for...else
таковы, и выбудет читать их на простом английском языке как:
for:
do stuff
condition:
break
else: # read as "else not break" or "else not condition"
do more stuff
Как говорили другие авторы, перерыв обычно возникает, когда вы можете найти то, что ищет ваш цикл, поэтому else:
становится «что делать, если целевой элемент не найден».
Пример
Вы также можете использовать обработку исключений, разрывы и циклы для всех вместе.
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")
Результат
x: 0
x: 1
x: 2
ASSERTION ERROR: x is 2
----------
# loop not completed (hit break), so else didn't run
Пример
Простой пример с ударом перерыва.
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")
Результат
y: 0
y: 1
y: 2
BREAK: y is 2
----------
# loop not completed (hit break), so else didn't run
Пример
Простой пример, когда нет перерыва, нет условия, вызывающего перерыв, и нет ошибок.
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")
Результат
z: 0
z: 1
z: 2
z_loop complete without break or error
----------