Почему у 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
не будет выполняться.