else в цикле
В Python у циклов for и while есть блок else, который выполняется, когда цикл заканчивается «естественным путём». Но ведь тот же код можно просто написать после цикла без else! Зачем тогда это вообще нужно?
2 ответа
else у цикла срабатывает, только если цикл дошёл до конца без break. В этом весь смысл: он избавляет от флага «нашли/не нашли».
Классика — поиск:
for user in users:
if user.id == target:
print('нашли:', user.name)
break
else:
print('никого не нашли')
Без else пришлось бы заводить found = False, ставить True перед break и проверять после цикла. Три лишние строки.
Так что «просто написать код после цикла» — не то же самое: тот код выполнится всегда, а ветка else — только когда break не сработал.
Технически в соседнем ответе всё верно, но добавлю ложку дёгтя: за несколько лет я for/else в живом коде видел раза три, и каждый раз читающий спотыкался. Слово else интуитивно читается как «если цикл не выполнился», а работает ровно наоборот.
Если поиск оформить функцией, конструкция вообще не нужна:
def find_user(users, target):
for u in users:
if u.id == target:
return u
return None
Дошли до return None — значит, не нашли. Читается без сносок в документацию. Знать for/else стоит, тащить его в каждый код — дело вкуса.