Цикл while в Python с примерами
Цикл while в Python повторяет блок кода, пока заданное условие остается истинным, и подходит для задач, где число повторений заранее неизвестно. Здесь разобраны синтаксис, проверка условия, бесконечный цикл while True, операторы break и continue, блок else, оператор := и несколько готовых программ.

Содержание статьи
Синтаксис цикла while
Запись состоит из ключевого слова while, условия, двоеточия и тела с отступом. Перед каждым проходом Python вычисляет условие: если оно истинно, тело выполняется, затем проверка повторяется. Как только условие стало ложным, управление переходит к первой строке после цикла.
n = 10
total = 0
i = 1
while i <= n:
total += i # добавляем текущее число
i += 1 # двигаем счетчик
print('Сумма:', total, 'Счетчик:', i)
# Сумма: 55 Счетчик: 11
Обратите внимание на значение счетчика после цикла: он равен 11, потому что именно на этом значении условие i <= n впервые оказалось ложным. Если условие ложно с самого начала, тело не выполнится ни разу.
Условие цикла и оператор :=
В условии может стоять любое выражение, а не только сравнение. Python проверяет его истинность: ноль, пустая строка, пустой список и None считаются ложью, остальное истиной. Это позволяет писать короткие циклы, которые работают, пока в коллекции есть элементы.
tasks = ['почта', 'отчет', 'звонок']
while tasks:
current = tasks.pop()
print('Выполняю:', current)
print('Задач не осталось')
Условия объединяют через and, or и not: while attempts < 3 and not success. Начиная с Python 3.8 в условии можно сразу присвоить значение оператором :=. Это убирает дублирование кода, когда значение нужно и проверить, и использовать.
words = []
while (word := input('Слово (пусто для выхода): ')) != '':
words.append(word)
print(words)
Бесконечный цикл
Цикл, условие которого никогда не становится ложным, называют бесконечным. Иногда это ошибка, иногда осознанный прием.
Случайное зацикливание
Самая частая ошибка новичков: забыть изменить переменную, от которой зависит условие. В примере ниже счетчик не увеличивается, i всегда равно 1, и программа никогда не дойдет до print.
n = 10
total = 0
i = 1
while i <= n:
total += i
# забыли i += 1, цикл не закончится
print(total)
Остановить зависшую программу в терминале можно сочетанием Ctrl+C, в PyCharm кнопкой Stop. Перед запуском цикла полезно ответить себе на вопрос: какая строка в теле приближает условие к False?
Прием while True
Намеренно бесконечный цикл используют для меню, игр, обработки ввода и серверов, которые ждут запросы. Условие выхода переносят внутрь тела и прерывают цикл оператором break. Такая конструкция заменяет цикл с постусловием (do-while), которого в Python нет: тело гарантированно выполнится хотя бы раз.
while True:
command = input('Команда (help, quit): ').strip().lower()
if command == 'quit':
print('Выход')
break
if command == 'help':
print('Доступны команды help и quit')
else:
print('Неизвестная команда')
Операторы break и continue
break немедленно завершает цикл, continue пропускает оставшиеся строки текущего прохода и возвращает к проверке условия. При использовании continue в while легко попасть в ловушку: если изменение счетчика стоит ниже continue, оно будет пропущено, и цикл зациклится. Поэтому счетчик меняют в начале тела.
i = 0
while i < 10:
i += 1 # сначала меняем счетчик
if i % 3 == 0:
continue # числа, кратные 3, пропускаем
print(i, end=' ')
# 1 2 4 5 7 8 10
Подробный разбор обоих операторов с примерами для for и while есть в статье про break и continue.
Блок else в цикле while
После цикла можно добавить else. Он выполнится один раз, когда условие станет ложным. Если цикл прерван через break, блок else пропускается. Отступ else должен совпадать с отступом слова while, иначе будет синтаксическая ошибка.
count = 0
while count < 3:
print('Цикл работает')
count += 1
else:
print('Условие стало ложным, цикл завершен')
Практическая польза видна в поиске с ограниченным числом попыток: else срабатывает, только если попытки кончились, а нужное значение так и не нашлось.
attempts = 3
while attempts > 0:
if input('PIN: ') == '1234':
print('Доступ открыт')
break
attempts -= 1
else:
print('Карта заблокирована')
Примеры программ с циклом while
Несколько типичных задач, где while удобнее, чем for, потому что число шагов зависит от данных.
Сумма цифр числа
На каждом шаге берем последнюю цифру остатком от деления на 10 и отбрасываем ее целочисленным делением. Цикл заканчивается, когда от числа ничего не осталось.
number = 90517
digits_sum = 0
while number > 0:
digits_sum += number % 10
number //= 10
print(digits_sum) # 22
Игра угадай число
Компьютер загадывает число с помощью модуля random, игрок угадывает, пока не попадет. Количество попыток заранее неизвестно, поэтому здесь нужен while.
import random
secret = random.randint(1, 100)
guess = None
tries = 0
while guess != secret:
guess = int(input('Ваше число: '))
tries += 1
if guess < secret:
print('Больше')
elif guess > secret:
print('Меньше')
print('Угадали за', tries, 'попыток')
Удвоение вклада
Сколько лет нужно держать деньги под 12% годовых, чтобы сумма выросла вдвое? Считаем год за годом, пока баланс меньше цели.
balance, target, years = 100_000, 200_000, 0
while balance < target:
balance *= 1.12
years += 1
print(years) # 7
Когда выбрать while, а когда for
Оба цикла взаимозаменяемы, но код получается чище, если выбрать подходящий. Цикл for перебирает готовую последовательность и сам следит за ее концом, while требует вручную управлять условием.
| Ситуация | Лучше подходит |
|---|---|
| Перебрать список, строку, словарь, файл | for |
| Повторить действие ровно N раз | for с range(N) |
| Повторять до правильного ввода | while |
| Алгоритм с неизвестным числом шагов (НОД, разбор числа по цифрам) | while |
| Постоянная работа программы до команды выхода | while True |
Если в while приходится вручную заводить индекс и увеличивать его на 1 до длины списка, это сигнал заменить его на for. Общий обзор обоих видов есть в статье про циклы в Python.
Частые вопросы
Ответы на вопросы, которые чаще всего задают о цикле while.
Сколько раз выполнится while, если условие сразу ложно?
Ни разу. Условие проверяется до первого прохода, поэтому при ложном условии Python сразу перейдет к коду после цикла, а если есть блок else, выполнит его.
Как сделать цикл с постусловием?
Напишите while True:, поместите в тело нужные действия, а в конце проверку if условие: break. Тело выполнится минимум один раз.
Можно ли записать while в одну строку?
Да, если тело состоит из простых инструкций: while x > 1: x //= 2. Для читаемости так делают редко, вложенные блоки в одну строку записать нельзя.
Почему цикл while с continue зависает?
Скорее всего, изменение переменной условия стоит после continue и на пропущенных проходах не выполняется. Перенесите его выше continue.
Что быстрее, for или while?
При переборе последовательности for обычно быстрее: проверка конца и получение элемента выполняются внутри интерпретатора, а в while каждую операцию со счетчиком выполняет ваш Python-код.