Конструкция else у циклов

Конструкция else у циклов

Конструкция else при циклах — одна из самых нестандартных возможностей Python. В других языках else используется только с if. Python позволяет писать else и после for, и после while. Поначалу это сбивает с толку, но логика здесь строгая и полезная.

Как работает else у цикла

else-блок цикла выполняется тогда, когда цикл завершился нормально — то есть без break. Если цикл был прерван через breakelse не выполняется.

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-блок выполняется при нормальном завершении цикла.
  • Если цикл прерван через breakelse не выполняется.
  • Если break не сработал — else выполняется.
  • Пустой цикл (нуль итераций) — нормальное завершение, else выполняется.
  • Главное применение: паттерн поиска без флага.

В следующем уроке разберём вложенные циклы — когда один цикл находится внутри другого.

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике