Django-Admin.ru

Цикл while в Python: синтаксис, break и примеры

Цикл while в Python: синтаксис и принцип работы, бесконечный цикл while True, break, continue и else, ввод до правильного ответа, отличие от for и ошибки.

Редакция Django-Admin.ru
· обновлено · 9 мин чтения

Содержание · 13 разделов
  1. Какие циклы есть в Python
  2. Синтаксис цикла while
  3. Примеры цикла while
  4. Сумма цифр числа
  5. Сколько лет удваивать вклад
  6. Обработка списка, пока он не опустеет
  7. Ввод до правильного ответа
  8. Бесконечный цикл while True и break
  9. Аналог do-while
  10. continue: перейти к следующей итерации
  11. Блок else у цикла while
  12. Оператор := в условии while
  13. Вложенные циклы while
  14. Цикл while или for
  15. Частые ошибки
  16. Бесконечный цикл: условие никогда не становится ложным
  17. = вместо == в условии
  18. Сравнение дробных чисел на равенство
  19. Сравнение строки из input() с числом
  20. Счётчик увеличивается после continue
  21. Частые вопросы
  22. Как выйти сразу из двух вложенных циклов while?
  23. Как сделать паузу между итерациями?
  24. Как остановить цикл через заданное время?
  25. Что быстрее для счётного цикла: while или for?
  26. Итог

Цикл while в Python повторяет блок кода, пока условие истинно. Короткий ответ: while count > 0: выполняет тело снова и снова, проверяя условие перед каждым повтором; как только условие становится ложным, программа идёт дальше. Внутри цикла обязательно должно меняться что-то, от чего зависит условие, иначе цикл станет бесконечным.

count = 3
while count > 0:
    print(count)
    count -= 1
print("Старт!")
3
2
1
Старт!

Ниже — синтаксис while в Python, бесконечный цикл while True, операторы break, continue и else, практические примеры и ошибки новичков. Примеры проверены на Python 3.12.

Какие циклы есть в Python

В языке программирования Python два цикла:

ЦиклКогда использоватьПример
forперебрать элементы коллекции или повторить n разfor item in items:
whileповторять, пока выполняется условиеwhile balance > 0:

Цикла do-while (с проверкой условия в конце) в Python нет — его заменяет while True с break, об этом ниже. Цикл for разобран в отдельной статье о цикле for; здесь — всё о while.

Синтаксис цикла while

while условие:
    тело цикла

Как работает цикл:

  1. Python вычисляет условие.
  2. Если оно истинно — выполняет тело цикла и возвращается к шагу 1.
  3. Если ложно — пропускает тело и переходит к коду после цикла.

Заголовок заканчивается двоеточием, тело выделяется отступом в 4 пробела. Если условие ложно с самого начала, тело не выполнится ни разу.

Условием может быть любое выражение. Python приводит его к bool: ложными считаются 0, пустая строка, пустой список и другие пустые коллекции, None и False, всё остальное — истинно. Подробнее о логических выражениях — в статье об условиях if/else.

Примеры цикла while

Сумма цифр числа

Типичная задача, где число повторов заранее неизвестно — оно зависит от длины числа:

n = 2026
total = 0
while n > 0:
    total += n % 10   # последняя цифра
    n //= 10          # отбросить последнюю цифру
print(total)  # → 10

Сколько лет удваивать вклад

Цикл идёт, пока сумма не достигнет цели:

amount = 1000
years = 0
while amount < 2000:
    amount *= 1.1
    years += 1
print(years)  # → 8
print(round(amount, 2))  # → 2143.59

Обработка списка, пока он не опустеет

Непустой список в условии истинен, поэтому while tasks: работает, пока в списке есть элементы:

tasks = ["письмо", "отчёт", "звонок"]
while tasks:
    task = tasks.pop()
    print("Выполняю:", task)
print(tasks)  # → []
Выполняю: звонок
Выполняю: отчёт
Выполняю: письмо
[]

pop() без аргумента забирает последний элемент списка. Для очереди «первым пришёл — первым ушёл» используйте collections.deque и popleft().

Ввод до правильного ответа

Цикл while — естественный выбор, когда программа ждёт корректного ввода от пользователя:

secret = "python"
answer = input("Пароль: ")
while answer != secret:
    print("Неверно, попробуйте ещё раз")
    answer = input("Пароль: ")
print("Доступ открыт")
Пароль: java
Неверно, попробуйте ещё раз
Пароль: Python
Неверно, попробуйте ещё раз
Пароль: python
Доступ открыт

Сравнение строк учитывает регистр, поэтому Python не совпал с python.

Бесконечный цикл while True и break

while True создаёт цикл, который сам не закончится. Выход из него делают оператором break — он немедленно завершает цикл:

while True:
    text = input("Введите число (или q для выхода): ")
    if text == "q":
        break
    if not text.isdigit():
        print("Это не число")
        continue
    print("Квадрат:", int(text) ** 2)
print("Пока!")
Введите число (или q для выхода): 5
Квадрат: 25
Введите число (или q для выхода): абв
Это не число
Введите число (или q для выхода): 12
Квадрат: 144
Введите число (или q для выхода): q
Пока!

Такой шаблон часто читается проще, чем цикл со сложным условием: условия выхода перечислены прямо в теле. Если программа зависла в бесконечном цикле, остановите её сочетанием Ctrl+C в терминале — Python прервёт выполнение с исключением KeyboardInterrupt.

Аналог do-while

Когда тело должно выполниться хотя бы один раз, а условие проверяется в конце, используйте while True с break в последней строке:

while True:
    age = input("Возраст: ")
    if age.isdigit() and 0 < int(age) < 120:
        break
    print("Введите число от 1 до 119")
print("Возраст:", age)
Возраст: abc
Введите число от 1 до 119
Возраст: 200
Введите число от 1 до 119
Возраст: 35
Возраст: 35

continue: перейти к следующей итерации

continue пропускает остаток тела и сразу возвращается к проверке условия:

n = 0
while n < 7:
    n += 1
    if n % 3 == 0:
        continue
    print(n, end=" ")
1 2 4 5 7

Счётчик n += 1 стоит до continue. Если увеличивать счётчик в конце тела, continue его перепрыгнет, и цикл зациклится.

Блок else у цикла while

Блок else выполняется, когда условие стало ложным, — то есть цикл завершился сам, без break. Это удобно, чтобы отличить «нашли» от «исчерпали попытки»:

attempts = 0
while attempts < 3:
    pin = input("PIN: ")
    attempts += 1
    if pin == "1234":
        print("Верно")
        break
else:
    print("Карта заблокирована")
PIN: 1111
PIN: 0000
PIN: 9999
Карта заблокирована

Если ввести верный PIN, сработает break, и блок else пропускается.

Оператор := в условии while

С Python 3.8 можно присвоить значение прямо в условии оператором := («морж»). Это убирает дублирование вызова input() перед циклом и внутри него:

while (line := input("> ")) != "стоп":
    print(line.upper())
> привет
ПРИВЕТ
> стоп

Вложенные циклы while

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

i = 1
while i <= 3:
    j = 1
    while j <= 3:
        print(i * j, end="\t")
        j += 1
    print()
    i += 1
1	2	3
2	4	6
3	6	9

Для таблиц и обхода коллекций вложенный for с range() короче и безопаснее — счётчики не нужно вести вручную.

Цикл while или for

Один и тот же счётный цикл можно написать обоими способами:

for i in range(3):
    print(i, end=" ")

i = 0
while i < 3:
    print(i, end=" ")
    i += 1

Оба выведут 0 1 2, но вариант с for и range() короче и не может зациклиться из-за забытого i += 1. Правило простое:

  • известно, что перебирать или сколько раз повторять — for;
  • известно только, до какого момента повторять — while.

Частые ошибки

Бесконечный цикл: условие никогда не становится ложным

count = 3
while count > 0:
    print(count)
    # забыли count -= 1 — цикл никогда не закончится

Проверьте, что в теле цикла меняется переменная из условия и что изменение ведёт к выходу. Остановить зависшую программу — Ctrl+C.

= вместо == в условии

while x = 1:  # → SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
    pass

Для сравнения нужен ==. Одиночный = — это присваивание, и в условии он запрещён.

Сравнение дробных чисел на равенство

x = 0.0
while x != 1.0:
    x += 0.1  # x пройдёт мимо 1.0 и цикл не остановится

Из-за погрешности двоичных дробей сумма десяти 0.1 равна 0.9999999999999999, а не 1.0. Используйте сравнение < или <= вместо !=, а лучше считайте шаги целым счётчиком. Об устройстве чисел с плавающей точкой — в статье о числах в Python.

Сравнение строки из input() с числом

input() всегда возвращает строку, поэтому "5" == 5 — это False, и цикл вида while answer != 5: не закончится никогда. Преобразуйте ввод: int(input()), а ошибку некорректного ввода перехватывайте через try/except.

Счётчик увеличивается после continue

Если continue срабатывает раньше строки i += 1, счётчик перестаёт меняться и цикл зацикливается. Увеличивайте счётчик в начале тела или перед continue.

Частые вопросы

Как выйти сразу из двух вложенных циклов while?

break завершает только внутренний цикл. Проще всего вынести циклы в функцию и выйти через return; другой вариант — флаг, который проверяет условие внешнего цикла.

def find_pair(target):
    i = 1
    while i <= 9:
        j = 1
        while j <= 9:
            if i * j == target:
                return i, j
            j += 1
        i += 1
    return None

print(find_pair(42))  # → (6, 7)

Как сделать паузу между итерациями?

Вызовите time.sleep(секунды) в теле цикла — программа будет ждать указанное время. Так опрашивают сервис или повторяют запрос не чаще раза в секунду.

import time

attempt = 1
while attempt <= 3:
    print("Попытка", attempt)
    time.sleep(1)
    attempt += 1

Как остановить цикл через заданное время?

Запомните момент окончания и сравнивайте с ним текущее время. Для замеров интервалов подходит time.monotonic(): в отличие от time.time(), его не сдвигает перевод системных часов.

import time

deadline = time.monotonic() + 5  # работать 5 секунд
while time.monotonic() < deadline:
    time.sleep(1)  # здесь полезная работа

Что быстрее для счётного цикла: while или for?

for с range(): счётчик увеличивается внутри range, а в while сравнение и i += 1 выполняются отдельными инструкциями на каждом шаге. В замере на Python 3.12 пустой цикл на 1000 шагов через while работал примерно в 2,5 раза дольше — в реальном коде разница обычно теряется на фоне тела цикла.

Итог

Цикл while повторяет тело, пока условие истинно, и подходит для задач с заранее неизвестным числом шагов: ввод до правильного ответа, обработка очереди, вычисления до достижения цели. Для выхода используйте break, для пропуска итерации — continue, а else срабатывает, если цикл завершился без break. Для перебора коллекций удобнее цикл for; остальные конструкции языка — в шпаргалке по синтаксису Python.

  • #Python
  • #while
  • #Циклы
  • #Синтаксис
  • #Для начинающих
↑ ↓ выборEnter открытьEsc закрыть