Гид по технологиям

Как работает цикл while в Python: полное руководство

4 min read Python Обновлено 07 Jan 2026
Цикл while в Python: руководство и примеры
Цикл while в Python: руководство и примеры

Изображение: руководство по использованию цикла while в Python

Короткая дефиниция

while — оператор повторения, который выполняет тело цикла, пока логическое выражение возвращает True.

Где применять цикл while

Цикл while подходит, когда количество итераций заранее неизвестно и нужно продолжать выполнение, пока не выполнится некоторое условие. Типичные случаи:

  • Ожидание событий или поступления данных.
  • Итерация по данным, когда логика выхода зависит от значения, вычисляемого внутри цикла.
  • Реализация простых состояний или опроса (polling).

Важно: для итераций по коллекциям чаще используют for — он короче и безопаснее.

Базовый синтаксис и поведение

Простой пример бесконечного цикла (не закрывайте такой код в реальном приложении без остановки):

while 3 < 5:
    print("It's less than 5")

Цикл выполняет тело до тех пор, пока условие истинно. Если условие всегда True, цикл будет бесконечным.

Практические примеры и пояснения

Ниже мы разберём исходные примеры и исправим их, чтобы код был предсказуемым и работал с набором значений.

Исходная демонстрация с температурой овцы:

StdTemperature = 37
sheep_temp = 38
while sheep_temp > StdTemperature:
    print("unhealthy")
else:
    print("healthy")

Комментарий: такой код зациклен, если sheep_temp не меняется. Лучше пройти по списку температур или изменять значение внутри цикла.

Корректный пример для одной проверки с возможностью выхода:

StdTemperature = 37
sheep_temp = 38
while sheep_temp > StdTemperature:
    print("unhealthy")
    # обновляем значение перед следующей итерацией
    # например, считываем следующую температуру из списка или источника
    break
else:
    print("healthy")

Пример для списка температур:

temperatures = [36.5, 38.2, 37.0, 39.1]
StdTemperature = 37
i = 0
while i < len(temperatures):
    t = temperatures[i]
    if t > StdTemperature:
        print(f"Sheep #{i+1}: unhealthy ({t})")
    else:
        print(f"Sheep #{i+1}: healthy ({t})")
    i += 1

Альтернатива с for (обычно компактнее и предпочтительнее):

for i, t in enumerate(temperatures, start=1):
    status = "unhealthy" if t > StdTemperature else "healthy"
    print(f"Sheep #{i}: {status} ({t})")

Примеры с break и continue

break завершает ближайший цикл, continue пропускает текущую итерацию и продолжает с следующей.

Корректный пример с continue (пропустить 9):

a = 10
b = 2
while b < 10:
    b += 1
    if b == 9:
        continue
    print(b)

Пример, выводящий чётные числа от 1 до 10:

a = 10
b = 1
while b <= 10:
    if b % 2 == 0:
        print(b)
    b += 1

Обратите внимание: порядок операций важен. Если вы увеличиваете b после проверки, логика меняется.

Частые ошибки и как их избежать

  • Бесконечный цикл: забыли изменить переменную, входящую в условие. Всегда проверяйте изменения состояния.
  • Неправильный отступ или место break: break должен быть внутри цикла.
  • Использование while для простого перебора коллекции вместо for.

Совет: при отладке временно добавьте счётчик итераций и лимит, чтобы избежать зависаний.

max_iters = 10_000
iters = 0
while some_condition:
    # ...
    iters += 1
    if iters > max_iters:
        raise RuntimeError("loop exceeded max iterations")

Когда while хуже for — примеры и контрпримеры

Контрпример (неудачное использование while): проход по списку без индексации и изменения индекса — быстро станет бесконечным.

Контрпример, где while уместен: чтение из сокета или потока, где вы не знаете, когда придут данные.

Ментальная модель: while — это “пока условие, делай”. for — “для каждого элемента, делай”.

Альтернативы и паттерны

  • for / enumerate — для коллекций.
  • itertools — для ленивых итераторов.
  • генераторы (yield) — для потоковой обработки.
  • рекурсия — для некоторых графов/деревьев (но может быть менее эффективной).

Выбор: если заранее известен набор элементов — используйте for. Если нужно ждать внешнего события или состояние меняется внутри цикла — while.

Проверки, тесты и критерии приёмки

Критерии приёмки

  • Цикл останавливается при удовлетворении условия выхода.
  • Невозможно попасть в бесконечный цикл при корректных входных данных.
  • Код покрыт тестами на граничные значения (пустой список, одно значение, большое количество).

Примеры тестов

  • Для списка температур: тест на пустой список — ожидается отсутствие вывода.
  • Для логики с break: тест, что break срабатывает и цикл завершается досрочно.

Роль — чек-листы

Для начинающего разработчика

  • Проверьте условие выхода.
  • Добавьте инкремент/обновление состояния внутри цикла.
  • Тестируйте граничные случаи.

Для ревьюера

  • Убедитесь, что цикл не может стать бесконечным на нормальных входных данных.
  • Предложите замену на for при переборе коллекции.

Для владельца продукта

  • Оцените читаемость и поддерживаемость кода.
  • Убедитесь в обработке ошибок и таймаутах для внешних ожиданий.

Мини-методология: как спроектировать цикл while безопасно

  1. Определите условие входа и выхода в одну строку.
  2. Убедитесь, что внутри цикла состояние, влияющее на условие, изменяется.
  3. Добавьте защитный лимит итераций при работе с внешними источниками.
  4. Пишите тесты для граничных случаев.

Пример принятой практики: обход массива с iterator-safe подходом

# безопасный цикл без индексов (используйте итератор)
it = iter(temperatures)
while True:
    try:
        t = next(it)
    except StopIteration:
        break
    # обработка t
    print(t)

Этот паттерн полезен, когда вы хотите вручную контролировать поток итерации.

Матричная сводка: while vs for

  • Предсказуемость: for > while
  • Подходит для потоков/событий: while > for
  • Простота: for > while
  • Контроль времени выполнения: while (можно поставить таймаут) > for

Риски и рекомендации

Риск: бесконечный цикл приведёт к зависанию сервиса или потреблению CPU. Митигируйте с лимитами итераций, таймаутами и мониторингом.

Рекомендации

  • Используйте for для коллекций.
  • Для внешних ожиданий добавляйте sleep и таймаут.
  • Логируйте события выхода из цикла.

Краткое резюме

Цикл while — мощный инструмент для задач с неизвестным числом итераций. Он простой по семантике, но требует дисциплины: проверяйте условие выхода, изменяйте состояние и избегайте бесконечных циклов. В большинстве задач обхода коллекций предпочтительнее for.

Важно: при переносе логики из прототипа в продакшн добавьте тесты на граничные случаи и лимиты итераций.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство