Циклы: for/while, break/continue🔗
Зачем нужны циклы: автоматизация повторений🔗
Готовка состоит из повторяющихся действий: разлить суп по пяти тарелкам, взбить десять яиц, помешивать блюдо до готовности. Если записывать каждый шаг отдельно, рецепт превратится в бесконечный лист одинаковых инструкций, который придётся переписывать при любом изменении числа гостей.
Тот же подход в коде выглядит так:
print("Налить суп в тарелку 1")
print("Налить суп в тарелку 2")
print("Налить суп в тарелку 3")
print("Налить суп в тарелку 4")
print("Налить суп в тарелку 5")
Цикл — управляющая конструкция, которая выполняет один и тот же блок инструкций многократно без дублирования кода в исходном файле.
Программирование предлагает два подхода к повторениям:
- С неизвестным числом итераций: выполнять действие, пока не наступит определённое условие (например, разливать суп, пока он не закончится в кастрюле). Так работает
while.
- С фиксированным числом итераций: выполнить действие ровно N раз (для каждого из 5 гостей). Для этого используют
for и range.
while: цикл с условием продолжения🔗
Цикл while работает по принципу «повторять, пока условие истинно». Синтаксис требует булева выражения — такого же, как в условных операторах из лекции 4 — после ключевого слова и двоеточия:
while условие:
тело_цикла
Перед каждой итерацией интерпретатор вычисляет значение выражения. Если результат True, выполняется тело; если False — цикл завершается, и поток переходит к следующей инструкции после блока.
Чтобы управлять количеством повторений, используют счётчик — переменную, изменяющуюся внутри цикла. Классический паттерн: инициализация, проверка, инкремент.
i = 1
while i <= 5:
print(i)
i += 1 # увеличиваем счётчик на 1
Здесь переменная i последовательно принимает значения 1,2,3,4,5. После вывода 5 выполняется i += 1, i становится 6, условие 6≤5 ложно, и цикл останавливается.
Цикл while удобен для накопления результата. Например, сумма первых n натуральных чисел вычисляется по формуле S=2n(n+1). Проверим алгоритмически для n=100:
n = 100
total = 0
i = 1
while i <= n:
total = total + i
i += 1
print(total) # 5050
Математическая проверка: S=2100⋅101=5050. Значения совпадают.
Опасность: бесконечный цикл. Если забыть изменить счётчик, условие останется истинным вечно — как суп на плите, который варится без помешивания. Программа «зависнет», выполняя тело снова и снова.
# ПРИМЕР ОШИБКИ: не запускать!
i = 1
while i <= 5:
print(i)
# забыли i += 1 — цикл бесконечен
Убедитесь, что переменная, влияющая на условие, изменяется внутри цикла и рано или поздно сделает его ложным.
for и range: счетные итерации🔗
Цикл for в Python подходит, когда количество повторений известно заранее — как рецепт, где написано «повторить 5 раз». Если while работает «пока не готово», то for выполняет блок кода «для каждого элемента из набора».
Чтобы получить такой набор чисел, используют функцию range(). Важно: range не создаёт список чисел (о списках — в лекции 8), а генерирует значения по одному, экономя память.
Базовый синтаксис:
for i in range(start, stop, step):
тело_цикла
При этом range формирует полуинтервал [start,stop): начальное значение включается, конечное — нет. Это классическая «ошибка off-by-one», с которой сталкиваются начинающие. Например, range(1, 5) даст числа 1,2,3,4, но не 5.
Если указан только один параметр, он интерпретируется как stop, а start по умолчанию равен 0:
# Сумма чисел от 1 до 100
total = 0
for i in range(1, 101): # 101 не включено!
total = total + i
# Результат: $S = \sum_{i=1}^{100} i = 5050$
Чтобы идти в обратном направлении, задают отрицательный шаг:
# Обратный отсчёт: 10, 9, ..., 1
for seconds in range(10, 0, -1):
print(seconds)
print("Старт!")
Здесь range(10, 0, -1) генерирует последовательность от 10 до 1, не включая 0. Параметр step может быть любым целым числом, кроме 0.
Различия между циклами можно свести в таблицу:
| Цикл |
Когда использовать |
Аналогия |
while |
Повторять до достижения состояния |
Мешать суп до готовности |
for |
Повторить фиксированное число раз |
Отмерить 5 стаканов муки |
Дальше разберём, как прервать цикл досрочно или пропустить итерацию.
break и continue: управление потоком выполнения🔗
Инструкция break прерывает выполнение цикла немедленно, не дожидаясь проверки основного условия. Управление передаётся первой команде после тела цикла. Обычно её помещают внутрь if, чтобы выйти при достижении определённого состояния.
n = 10
while n > 0:
n = n - 3
if n < 0:
break
print("Первое отрицательное:", n)
Инструкция continue прерывает текущую итерацию и переходит к следующей. Python пропускает весь код, оставшийся в теле цикла после continue, и возвращается к проверке условия (или к следующему элементу итератора).
for i in range(6):
if i % 2 != 0:
continue
print(i)
Частые break разбивают логику цикла на множество точек выхода, создавая «спагетти-код». Такой код сложно читать и отлаживать. Как структурировать программы без избыточных прерываний — в лекции 12.
Практика: типичные ошибки и шаблоны🔗
Частая ошибка off-by-one: range(10) даёт 0–9, не 1–10. Как посолить суп, не дойдя до последней тарелки.
# Забытый инкремент → вечная варка
while n < 5:
print(n)
# n += 1 пропущено!
| Ошибка |
Симптом |
Рецепт |
| Off-by-one |
Пропуск порции |
range(1, 11) |
| Забытый шаг |
Бесконечность |
Проверять изменение счётчика |
| break/continue |
Неправильный выход |
break — стоп, continue — далее |
Тренировка: таймер обратного отсчёта.
t = 3
while t > 0:
print(t)
t -= 1
Циклы автоматизируют процессы. Следующий уровень — функции (лекция 6).