Циклы while в Python: подробное руководство
Циклы while в Python: синтаксис, break, continue, else, вложенные и бесконечные циклы с понятными примерами.
Цикл while выполняет блок кода многократно до тех пор, пока условие равно True. В отличие от цикла for, который перебирает известную последовательность элементов, цикл while — правильный выбор, когда заранее неизвестно, сколько итераций потребуется: например, при чтении пользовательского ввода, опустошении очереди или повторных попытках выполнить операцию до её успешного завершения.
В этой главе рассматриваются:
- Базовый синтаксис и порядок вычисления условия
break— досрочный выход из циклаcontinue— переход к следующей итерации- Конструкция
else— код, который выполняется при нормальном завершении цикла - Вложенные циклы
while - Заглушка
pass - Бесконечные циклы и способы их избежать
- Когда выбирать
while, а когдаfor
Базовый синтаксис
while condition:
# block executed while condition is TruePython вычисляет condition перед каждой итерацией. Если оно равно True, выполняется блок с отступом. После завершения блока условие проверяется снова. Цикл завершается, как только условие принимает значение False.
Счёт от 1 до 5
Вывод:
1
2
3
4
5Здесь i начинается с 1. После каждого print значение i увеличивается на 1. Когда i достигает 6, условие i <= 5 становится False и цикл останавливается.
Переменная-счётчик должна обновляться внутри цикла. Если забыть i += 1 (или аналогичное обновление), условие никогда не станет False и возникнет бесконечный цикл.
Пример обратного отсчёта
count = 5
while count > 0:
print(count)
count -= 1
print("Liftoff!")Вывод:
5
4
3
2
1
Liftoff!Код после блока while выполняется один раз после завершения цикла — в данном случае print("Liftoff!") находится за пределами цикла.
Цикл до опустошения списка
Любой объект, имеющий булево значение, может служить условием. Пустой список является ложным значением (falsy), поэтому можно естественным образом опустошать список:
stack = [1, 2, 3]
while stack:
print(stack.pop())Вывод:
3
2
1while stack — сокращение для while len(stack) > 0. Когда список становится пустым, он принимает ложное значение и цикл завершается.
Оператор break
break немедленно выходит из цикла, независимо от условия.
Вывод:
0
1
2
3
4Когда num равно 5, срабатывает break и цикл завершается — значения от 5 до 9 не выводятся.
Когда использовать break: остановить поиск, как только найдено совпадение; прервать цикл при возникновении ошибки; выйти из цикла меню, когда пользователь выбирает «выход».
Оператор continue
continue пропускает остаток текущей итерации и сразу возвращается к проверке условия.
i = 0
while i < 8:
i += 1
if i % 2 == 0:
continue
print(i)Вывод:
1
3
5
7Когда i чётное, continue пропускает print(i) и цикл возвращается к вычислению условия с обновлённым i.
Важно: увеличивайте счётчик перед проверкой continue, а не после. Если i += 1 стоит после continue, i останется чётным навсегда и цикл будет выполняться бесконечно.
Конструкция else
Цикл while в Python поддерживает необязательный блок else. Он выполняется только если цикл завершился нормально — то есть условие стало False — и пропускается, если цикл был прерван оператором break.
Нормальное завершение
i = 1
while i <= 3:
print(i)
i += 1
else:
print("Done!")Вывод:
1
2
3
Done!Цикл, прерванный оператором break
i = 1
while i <= 5:
if i == 3:
break
print(i)
i += 1
else:
print("No break")Вывод:
1
2"No break" не выводится, потому что break завершил цикл до того, как условие могло стать False.
Практическое применение: линейный поиск
Конструкция else особенно полезна для шаблонов поиска. Блок else выполняется только тогда, когда искомый элемент не найден:
numbers = [4, 7, 2, 9, 1]
target = 9
i = 0
while i < len(numbers):
if numbers[i] == target:
print("Found", target, "at index", i)
break
i += 1
else:
print(target, "not found")Вывод:
Found 9 at index 3Вложенные циклы while
Цикл while может содержать внутри себя другой цикл while. Внутренний цикл выполняет все свои итерации при каждой отдельной итерации внешнего цикла.
row = 1
while row <= 3:
col = 1
while col <= 3:
print(row * col, end=" ")
col += 1
print()
row += 1Вывод:
1 2 3
2 4 6
3 6 9 Важно: оператор break внутри внутреннего цикла выходит только из внутреннего цикла. Чтобы одновременно выйти из обоих циклов, используйте переменную-флаг или оформите код в виде функции и используйте return.
Оператор pass
pass — это заглушка, не выполняющая никаких действий. Используйте её, когда синтаксис требует наличия цикла while, но тело ещё не реализовано:
i = 0
while i < 3:
pass # TODO: add logic later
i += 1Без pass Python вызовет IndentationError, поскольку пустой блок является недопустимым синтаксисом.
Бесконечные циклы
Бесконечный цикл выполняется вечно, потому что его условие никогда не становится False. В большинстве случаев это ошибка — но существуют и намеренные случаи использования.
Случайный бесконечный цикл
# WARNING: this loop never ends — do not run
i = 1
while i <= 5:
print(i)
# forgot to increment iБез i += 1 переменная i остаётся равной 1, условие всегда True, и цикл выполняется до тех пор, пока программа не будет остановлена вручную (Ctrl+C).
Намеренный бесконечный цикл с break
# WARNING: intentional infinite loop — requires Ctrl+C to stop outside an app
while True:
answer = input("Type 'quit' to exit: ")
if answer == "quit":
break
print("You typed:", answer)while True — намеренная идиома, означающая «продолжать до явной остановки». Внутри обязательно должен быть break (или return), иначе программа зависнет.
Дополнительные шаблоны с интерактивными циклами смотрите в главе Пользовательский ввод в Python.
Циклы while и for: сравнение
| Ситуация | Предпочтительный вариант |
|---|---|
| Известно количество итераций или есть последовательность | for |
| Цикл выполняется до изменения условия | while |
| Нужно читать ввод, пока пользователь не выйдет | while True + break |
| Нужны индекс и значение из списка | for + enumerate() |
| Нужно опустошить или потребить структуру данных | while |
Используйте for, когда это возможно; переходите на while, когда конечное условие динамично или неизвестно в начале цикла.