Конструкция else у циклов
Конструкция else у циклов
Конструкция else при циклах — одна из самых нестандартных возможностей Python. В других языках else используется только с if. Python позволяет писать else и после for, и после while. Поначалу это сбивает с толку, но логика здесь строгая и полезная.
Как работает else у цикла
else-блок цикла выполняется тогда, когда цикл завершился нормально — то есть без break. Если цикл был прерван через break — else не выполняется.
for i in range(5):
print(i)
else:
print("Цикл завершён нормально")
Вывод:
0
1
2
3
4
Цикл завершён нормально
Теперь с break:
for i in range(5):
if i == 3:
break
print(i)
else:
print("Этого не увидим!") # не выполнится — был break
print("Продолжение после цикла")
Вывод:
0
1
2
Продолжение после цикла
Зачем это нужно: паттерн «нашли/не нашли»
Главное применение else у цикла — поиск. После цикла поиска нужно знать: был ли break (нашли) или нет (не нашли).
Без else — нужна дополнительная переменная-флаг:
numbers = [3, 7, 2, 9, 4]
target = 6
found = False
for n in numbers:
if n == target:
found = True
break
if found:
print(f"Число {target} найдено")
else:
print(f"Число {target} не найдено")
С else у цикла — чище и без флага:
numbers = [3, 7, 2, 9, 4]
target = 6
for n in numbers:
if n == target:
print(f"Число {target} найдено")
break
else:
print(f"Число {target} не найдено")
else-блок выполнится только если break не сработал — то есть элемент не был найден.
else у while
Аналогично работает и с while:
n = 2
is_prime = True
while n < 100:
divisor = 2
while divisor < n:
if n % divisor == 0:
is_prime = False
break
divisor += 1
else:
if is_prime:
print(n) # простые числа до 100
n += 1
(Упрощённый пример — в реальности алгоритм проверки простых чисел пишут иначе, но для демонстрации else подходит.)
# Простой пример else у while:
x = 10
while x > 0:
x -= 3
else:
print(f"Цикл завершён, x = {x}") # x = -2
else у while выполняется, когда условие цикла стало False (нормальное завершение).
Практический пример: поиск простого числа
def is_prime(n):
if n < 2:
return False
for d in range(2, n):
if n % d == 0:
break
else:
return True # цикл прошёл до конца — делителей не нашли
return False
for num in range(2, 20):
if is_prime(num):
print(num, end=" ")
# 2 3 5 7 11 13 17 19
Здесь else у for означает: «если цикл дошёл до конца без break — делителей нет, число простое».
Распространённое заблуждение
Многие думают, что else у цикла выполняется «если цикл не выполнился ни разу» (по аналогии с if/else). Это неверно.
for i in range(0): # пустой range — цикл не выполняется ни разу
pass
else:
print("else сработал") # выводится! пустой цикл = нормальное завершение
Правило одно: else выполняется при нормальном завершении (без break). Пустой цикл — тоже нормальное завершение.
Рекомендации по использованию
else у цикла — специфическая возможность Python, которую знают не все. Если вы работаете в команде, где не все знакомы с этой конструкцией — добавьте комментарий:
for item in items:
if predicate(item):
result = item
break
else:
result = None # break не сработал — ничего не нашли
В современном коде эту конструкцию используют умеренно. Альтернатива с флагом или с функцией next() + генераторным выражением часто читабельнее. Но знать о else у цикла необходимо — вы будете встречать его в чужом коде.
Проверь себя
Что выведет следующий код?
for i in range(3):
pass
else:
print("done")
Цикл выполнится 3 раза (ничего не делая). break не было → else выполняется → вывод: done.
Итог
for/while ... else:—else-блок выполняется при нормальном завершении цикла.- Если цикл прерван через
break—elseне выполняется. - Если
breakне сработал —elseвыполняется. - Пустой цикл (нуль итераций) — нормальное завершение,
elseвыполняется. - Главное применение: паттерн поиска без флага.
В следующем уроке разберём вложенные циклы — когда один цикл находится внутри другого.