Цикл, следящий за условием
Там, где for итерируется по известной последовательности, while продолжает крутиться пока условие истинно. К нему тянешься, когда заранее не знаешь, сколько итераций понадобится — повторять до успеха, читать ввод, пока пользователь не скажет «хватит», опрашивать сервис, пока он не ответит.
Форма простая:
Выведет от 0 до 4. Python проверяет условие в начале каждой итерации. Истинно — тело выполняется. Потом снова проверяет. Когда условие становится ложным — цикл заканчивается.
Заметь, что count += 1 — критично. Без него условие осталось бы истинным навсегда — бесконечный цикл. Это главная ловушка while и главная причина предпочитать for, когда он возможен.
Когда while — правильный инструмент
Несколько классических случаев:
Повторять до успеха.
Читать ввод, пока пользователь не выйдет.
Обработать очередь.
Общее у них то, что ты следишь за сменой состояния, а не идёшь по элементам.
while True — это нормально
Этот паттерн будет встречаться часто:
Это идиоматичный Python, когда «настоящее» условие выхода живёт внутри тела, а не красиво проверяется сверху. Читать такое проще, чем придумывать флаг should_continue, который ты обновляешь в одном месте, а проверяешь в другом.
Единственное правило: убедись, что break (или return, или выброс исключения) есть, и код до него в итоге доберётся. Безусловный while True: без выхода — классический способ подвесить программу.
Как избежать бесконечного цикла
Бесконечные циклы возникают, когда условие остаётся истинным навсегда. Обычные подозреваемые:
- Забыл обновить переменную.
while count < 5:требует чего-то внутри тела, что меняетcount. - Обновил не ту переменную.
while i < 10:, а внутриj += 1— легко пропустить, если переменных больше пары. - Сравнение float-ов.
while x != 1.0:может крутиться вечно, еслиxлишь приближается к 1.0. Используй<=илиabs(x - 1.0) < tolerance.
Если застрял в бесконечном цикле в терминале — нажми Ctrl+C. Это посылает сигнал прерывания, и Python останавливает то, что делает.
break, continue и else
У while те же три инструмента управления потоком, что и у for:
breakнемедленно выходит из цикла.continueпропускает к следующей итерации (так что условие снова проверяется).elseсрабатывает, если цикл закончился безbreak.
Это примитивная проверка на простоту. Если сработал внутренний break — число составное. Если цикл вышел естественно (условие стало ложным), срабатывает else и объявляет число простым.
while против for: что выбрать?
Быстрый мысленный тест:
- Есть коллекция, по которой нужно пройти? →
for. - Нужно выполнить цикл фиксированное число раз? →
for i in range(n):. - Крутишься до смены условия? →
while.
В раннем Python-коде for покрывает 90% циклов. while появляется, когда ты делаешь что-то вроде опроса, повторов или простого REPL. Если ты используешь while для прохода по списку с индексом — это сигнал переключиться на for + enumerate.
Практическая программа на while
Игра «угадай число» — классический пример, потому что количество итераций зависит от того, как играет пользователь:
Заранее знать, сколько попыток понадобится, нельзя — это зависит от догадок пользователя. Ради этого while и существует.
Впереди
Ты уже видел два типа циклов, которые Python даёт. Дальше — range() подробнее: он появляется почти в каждом «счётном» for-цикле, и мелкие нюансы стоит понимать до перехода к коллекциям.
Часто задаваемые вопросы
Когда использовать while вместо for?
Используй while, когда заранее не знаешь, сколько итераций нужно — например, повторение до успеха или чтение ввода, пока пользователь не напишет 'quit'. Используй for, когда шагаешь по известной коллекции.
Как избежать бесконечного цикла в Python?
Убедись, что что-то внутри цикла в конце концов делает условие ложным. Самая частая причина бесконечных циклов — забыть обновить переменную, от которой зависит условие. Если наткнулся — нажми Ctrl+C в терминале, чтобы остановить.
while True — это плохая практика?
while True — это плохая практика?Сама по себе — нет. while True: с явным break внутри — вполне нормальный паттерн для «крутимся, пока не сработает конкретное условие выхода». Чище, чем придумывать булев флаг, которым нужно управлять в двух местах.