Почему у Python есть "else" в "for-else" и "while-else"?

Я начинающий Python. Я нахожу, что "else" в "for-else" и "while-else" совершенно не нужно. Поскольку "for" и "while", наконец, будут выполняться до "else" , и вместо этого мы можем использовать обычные строки.

Например:

for i in range(1, 5):
    print i
else:
    print 'over'

и

for i in range(1, 5):
    print i
print 'over'

совпадают.

Итак, почему у Python есть "else" в "for-else" и "while-else"?

Ответ 1

Вы ошибаетесь в семантике for/else. Предложение else выполняется только в том случае, если цикл завершен, например, если оператор break не встречался.

Типичный для /else цикл выглядит следующим образом:

for x in seq:
    if cond(x):
        break
else:
    print "Didn't find an x I liked!"

Подумайте о "else" как о спаривании со всеми "if" в теле цикла. Ваши образцы одинаковы, но с предложениями "break" в миксе они не являются.

Более длинное описание той же идеи: http://nedbatchelder.com/blog/201110/forelse.html

Ответ 2

Оператор for ... else используется для реализации циклов поиска.

В частности, он обрабатывает случай, когда цикл поиска не находит ничего.

for z in xrange(10):
    if z == 5:
        # We found what we are looking for
        print "we found 5"
        break # The else statement will not execute because of the break
else:

    # We failed to find what we were looking for
    print "we failed to find 5"
    z = None

print 'z = ', z

выход:

we found 5
z =  5

Этот поиск совпадает с

z = None
for z in xrange(10):
    if 5 == z:
        # We found what we are looking for
        break

if z == None:
    print "we failed to find 5"
else:
    print "we found 5"

print 'z = ', z

Помните, что for не инициализирует z, если список поиска пуст (т.е. []). Поэтому мы должны гарантировать, что z определяется, когда мы используем его после поиска. Следующее вызовет исключение, потому что z не определяется, когда мы пытаемся его распечатать.

for z in []:
    if 5 == z:
        break

print "z = ",z

Выход

    print "z = ",z
NameError: name 'z' is not defined

Таким образом, предложение else будет выполняться всякий раз, когда цикл for завершается естественным образом. Если в цикле for возникает разрыв или исключение, оператор else не будет выполняться.