Циклы while
for умеет перебирать не только числа — а while повторяет действие, пока условие остаётся истинным, сколько бы раз это ни потребовалось.
Когда число повторов заранее неизвестно
for отлично подходит, когда мы заранее знаем, сколько раз
нужно повторить действие — «4 стороны квадрата», «все буквы слова». Но что делать, если
число повторов заранее неизвестно — например, «повторяй, пока пользователь не угадает
число»? Для таких задач существует второй вид цикла — while.
Циклы while
В отличие от for, while
повторяется пока истинно условие:
count = 0
while count < 5:
print(count)
count += 1
Канонический flowchart цикла while
Три части цикла while
| Часть | Код | Роль |
|---|---|---|
| Инициализация | count = 0 | готовит состояние ДО первой проверки условия |
| Условие | count < 5 | проверяется перед каждой итерацией, включая самую первую |
| Обновление | count += 1 | меняет состояние так, чтобы условие рано или поздно стало ложным |
| Итерация | Проверка count < 5 | Вывод | count после шага |
|---|---|---|---|
| 1 | 0 < 5 → да | 0 | 1 |
| 2 | 1 < 5 → да | 1 | 2 |
| 3 | 2 < 5 → да | 2 | 3 |
| 4 | 3 < 5 → да | 3 | 4 |
| 5 | 4 < 5 → да | 4 | 5 |
| — | 5 < 5 → нет | цикл завершён | — |
while проверяется до тела — значит, если условие изначально ложно, тело не выполнится вообще ни разу (ноль итераций). В Python нет отдельного «сначала выполни, потом проверь» цикла (в некоторых других языках он называется do/while) — если такое поведение нужно, его моделируют через while True с break в конце тела (мы увидим этот приём на следующей странице).Бесконечный цикл — намеренно и случайно
Посмотрите на этот код внимательно:
count = 0
while count < 5:
print(count)
# забыли count += 1!
Ctrl+C (или кнопку «Стоп»/«Interrupt kernel» в Jupyter). Всегда проверяйте, что внутри while есть шаг, который рано или поздно сделает условие ложным.while True — тоже нормально
while True создаёт цикл, условие которого само по себе никогда
не станет ложным — единственный выход из него: break внутри тела.
Это распространённый и совершенно правильный приём, когда условие остановки естественнее
проверить в середине тела, а не в его начале — мы воспользуемся им уже на следующей странице.
while True: не является «плохой практикой» сама по себе — это осознанный инструмент. Проблема возникает только тогда, когда внутри забыли поставить break — вот тогда цикл действительно никогда не остановится.Перебор строк — напоминание
Строка — это последовательность символов (глава 8) — for
умеет перебирать её напрямую, без индексов (подробный разбор индекса и значения — на
странице про enumerate()):
for letter in "Python":
print(letter)