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

Как работает цикл 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
Автор
Редакция

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

Установка IDLE на Ubuntu — быстрый старт
Python

Установка IDLE на Ubuntu — быстрый старт

Как отправить групповое SMS на Android
Mobile

Как отправить групповое SMS на Android

Как сделать стилус для планшета своими руками
Сделай сам

Как сделать стилус для планшета своими руками

Защита фотографий от кражи в интернете
Фотография

Защита фотографий от кражи в интернете

Создать Linux VM внутри Windows VM через Hyper‑V
Виртуализация

Создать Linux VM внутри Windows VM через Hyper‑V

Как настроить стороннюю мышь на Mac
Mac

Как настроить стороннюю мышь на Mac