Цикл while в Python: синтаксис, break и примеры
Цикл while в Python: синтаксис и принцип работы, бесконечный цикл while True, break, continue и else, ввод до правильного ответа, отличие от for и ошибки.
Содержание · 13 разделов
- Какие циклы есть в Python
- Синтаксис цикла while
- Примеры цикла while
- Сумма цифр числа
- Сколько лет удваивать вклад
- Обработка списка, пока он не опустеет
- Ввод до правильного ответа
- Бесконечный цикл while True и break
- Аналог do-while
- continue: перейти к следующей итерации
- Блок else у цикла while
- Оператор := в условии while
- Вложенные циклы while
- Цикл while или for
- Частые ошибки
- Бесконечный цикл: условие никогда не становится ложным
- = вместо == в условии
- Сравнение дробных чисел на равенство
- Сравнение строки из input() с числом
- Счётчик увеличивается после continue
- Частые вопросы
- Как выйти сразу из двух вложенных циклов while?
- Как сделать паузу между итерациями?
- Как остановить цикл через заданное время?
- Что быстрее для счётного цикла: while или for?
- Итог
Цикл 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 условие:
тело цикла
Как работает цикл:
- Python вычисляет условие.
- Если оно истинно — выполняет тело цикла и возвращается к шагу 1.
- Если ложно — пропускает тело и переходит к коду после цикла.
Заголовок заканчивается двоеточием, тело выделяется отступом в 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
- #Циклы
- #Синтаксис
- #Для начинающих