Цикл while в Python: повторение пока условие истинно
Автор: Казачкин Даниил Михайлович · Обновлено
Цикл while перед каждой итерацией вычисляет условие. Если оно истинно, выполняется блок и проверка повторяется. Если условие ложно с самого начала, тело не выполнится ни разу. Поэтому программист отвечает и за начальное состояние, и за изменение данных внутри цикла.
Обратный отсчёт
seconds = 3
while seconds > 0:
print(seconds)
seconds -= 1
print('Старт!')Ожидаемый вывод:
3
2
1
Старт!После каждой печати seconds уменьшается. Когда значение становится нулём, условие seconds > 0 ложно и управление переходит к последнему print.
Как возникает бесконечный цикл
Если удалить seconds -= 1, состояние не изменится и условие навсегда останется истинным. Остановить такой запуск в терминале обычно можно Ctrl+C, после чего нужно исправить причину, а не просто перезапустить. Полезно прогнать первые три итерации на бумаге: записать значение до проверки и после изменения.
while подходит, когда число повторений заранее неизвестно: например, ввод продолжается до команды stop. Для известного диапазона чаще проще for. Команды break и continue существуют, но сначала научитесь строить ясное условие завершения без лишних выходов.
Ввод до нуля
Напишите программу, которая читает целые числа и суммирует их, пока пользователь не введёт 0. Ноль служит сигналом и не влияет на сумму. Проверьте последовательность 5, -2, 4, 0 — ожидается 7 — и случай, когда первым введён 0. Добавьте счётчик принятых чисел. Перед запуском сформулируйте инвариант: total равен сумме всех уже обработанных значений.
Инвариант завершения
Для цикла ввода пароля сформулируйте величину или событие, которое делает условие ложным. Добавьте ограничение не более трёх попыток и проверьте правильный пароль на первой, третьей попытке и полное исчерпание. В каждой итерации печатайте номер попытки только во время отладки. Затем рассмотрите ошибочную версию, где счётчик увеличивается лишь при правильном пароле, и объясните бесконечное поведение. Хороший цикл while должен отвечать на три вопроса: что истинно до старта, что меняется в теле и почему когда-нибудь наступит завершение.
Практикум: ограниченное число попыток PIN
Разрешите не больше трёх попыток ввода PIN. Храните число использованных попыток и признак успеха, завершайте цикл при верном значении или исчерпании лимита. Проверьте успех с первой и третьей попытки, три ошибки и пустой ввод. Запишите инвариант: перед каждой итерацией использовано меньше трёх попыток и доступ ещё не получен. После цикла определите причину завершения, чтобы не печатать одновременно успех и блокировку. Увеличение счётчика должно происходить ровно один раз за попытку.
Контрольная точка
Какая ошибка приводит к четвёртой попытке? Проследите значения счётчика до и после ввода и сформулируйте условие цикла с однозначной границей.
Частые вопросы
Когда в while нужен break?
break удобен для дополнительного раннего выхода, но часто условие можно выразить прямо через состояние цикла. Выберите вариант, в котором легко доказать ограничение попыток и понять причину завершения.