Цикл while в Python: когда цикла for недостаточно
Этот урок переведён с английского оригинала.Read in EnglishLeer en españolСообщить об ошибке в переводе
Торговый автомат не знает, сколько монет вы в него опустите. Он терпеливо ждёт: «пока сумма меньше цены, принимать монеты». Цикл for ему не подойдёт, потому что количество итераций заранее неизвестно. Ему нужен цикл while.
В этом уроке вы научитесь использовать циклы while там, где действие нужно повторять, пока не изменится условие. Вы также узнаете, как избежать бесконечных циклов, как досрочно выйти из цикла с помощью break и когда выбирать while вместо for.
К концу урока у вас в арсенале будет два вида циклов: for для перебора известных коллекций и while для повторения, пока не выполнится условие.
Как работает цикл while в Python?
Цикл while проверяет условие перед каждой итерацией. Если условие равно True, выполняется тело цикла. Затем Python возвращается в начало и снова проверяет условие. Так повторяется, пока условие не станет False.
Представьте охранника у двери, который проверяет ваш пропуск каждый раз, когда вы пытаетесь войти. Пока пропуск действителен, вас пропускают. Как только срок его действия истекает, дверь для вас закрыта.
1 2 3 4 5 Done!
Вот как это работает: Python проверяет count <= 5. Поскольку count начинается с 1, условие равно True, и тело выполняется: выводится count, и к нему прибавляется 1. Затем Python снова проверяет условие. Так продолжается, пока count не станет равным 6: тогда 6 <= 5 даёт False, и цикл останавливается.
Самое важное: что-то внутри цикла должно рано или поздно сделать условие `False`. Здесь count += 1 увеличивает счётчик, пока он не превысит 5. Без этой строки цикл работал бы вечно.
Как считать и накапливать значения в цикле while?
Циклы while отлично подходят для задач, где данные нужно обрабатывать до достижения определённой цели. Вы задаёте условие, и цикл продолжает работу, пока цель не достигнута.
After 10 doubles, the value is 1024
Такую задачу непросто записать циклом for, ведь мы не знаем заранее, сколько удвоений понадобится. Цикл while работает, пока значение не превысит 1000, а мы считаем, сколько раз он выполнился.
Sum of 1 to 14 = 105
Цикл складывает последовательные числа (1, 2, 3, ...), пока сумма не достигнет 100 или не превысит это значение. После цикла number на единицу больше последнего прибавленного числа, потому что строка number += 1 выполняется после каждого сложения. Поэтому мы выводим number - 1.
Что такое бесконечный цикл и как работает break?
Бесконечный цикл никогда не завершается сам: его условие ни разу не становится False. Иногда это ошибка. Но иногда так делают намеренно: создают бесконечный цикл и выходят из него с помощью break, когда придёт время.
# DON'T RUN THIS - it never stops!
count = 1
while count <= 5:
print(count)
# Oops, forgot count += 1while True:
answer = "yes"
print("Looping...")
if answer == "yes":
break
print("Escaped!")while True создаёт цикл, который по умолчанию работает вечно. Инструкция break немедленно завершает цикл и передаёт управление первой строке после него. Этот шаблон очень часто встречается в меню, игровых циклах и при проверке ввода.
Guess 1: 3 Too low! Guess 2: 9 Too high! Guess 3: 5 Too low! Guess 4: 7 Correct! You got it in 4 tries!
Цикл работает, пока кто-нибудь не угадает загаданное число. Предсказать, когда это случится, нельзя, поэтому while True с break здесь самое естественное решение. break выполняется только при guess == secret, так что цикл завершается ровно в нужный момент.
Как проверять ввод с помощью цикла while?
Одно из самых практичных применений цикла while связано с проверкой ввода: программа снова и снова запрашивает данные, пока пользователь не введёт что-то допустимое. Именно этот шаблон стоит за каждой формой с сообщением «введите корректный адрес электронной почты».
Enter your age: abc Please enter a number. Enter your age: -5 Please enter a number. Enter your age: 0 Age must be between 1 and 120. Enter your age: 25 Your age: 25
Цикл спрашивает снова и снова, пока не получит допустимый возраст. Неверный ввод, например «abc» или отрицательное число, вызывает сообщение об ошибке, и цикл повторяется. Только когда введён допустимый возраст, условие age <= 0 or age > 120 становится False, и цикл завершается.
Обратите внимание на инструкцию continue: если введено не число, мы пропускаем остаток тела цикла и сразу возвращаемся в начало. Подробнее о continue вы узнаете в следующем уроке.
Когда использовать while, а когда for?
И for, и while умеют повторять код, но созданы они для разных ситуаций. Правильный выбор делает код понятнее и защищает от ошибок.
Используйте for, когда... | Используйте while, когда... |
|---|---|
| Вы перебираете коллекцию | Вы ждёте, пока изменится условие |
| Вы знаете, сколько раз повторять | Вы НЕ знаете, сколько раз повторять |
| Вы обрабатываете каждый элемент списка | Вы повторяете, пока что-то не произойдёт |
| Пример: вывести имя каждого студента | Пример: спрашивать, пока ввод не станет корректным |
I like apple I like banana I like cherry 3 9 27 81 243 First power of 3 >= 100: 243
Цикл for идеально подходит для списка фруктов: мы точно знаем, что перебираем. Цикл while идеально подходит для степеней тройки: мы не знаем заранее, сколько умножений понадобится, чтобы превысить 100.
names = ["Alice", "Bob", "Charlie"]
i = 0
while i < len(names):
print(names[i])
i += 1names = ["Alice", "Bob", "Charlie"]
for name in names:
print(name)Практические упражнения
Теперь ваша очередь писать циклы while! Эти упражнения посвящены задачам, где циклы while проявляют себя лучше всего: неизвестное число итераций, остановка по условию и накопление.
Помните: в цикле while что-то должно меняться. Если ваш цикл работает вечно, проверьте, обновляете ли вы переменную из условия.
С помощью цикла while выведите обратный отсчёт от 5 до 1, а в последней строке выведите «Blastoff!».
Ожидаемый вывод:
5
4
3
2
1
Blastoff!Начните с 1 и удваивайте число, пока оно не превысит 500. Выводите каждое значение по ходу дела (включая первое значение больше 500). Затем выведите итоговый результат.
Ожидаемый вывод:
1
2
4
8
16
32
64
128
256
512
First power of 2 over 500: 512Подсказка: используйте цикл while True с break после того, как значение превысит 500.
Не запуская код, предскажите, что именно он выведет. Внимательно пройдите по каждой итерации и следите, когда проверяется условие и когда меняется x.
Затем запустите код и проверьте свой ответ.
Этот код должен посчитать, сколько цифр в числе, многократно деля его на 10. Но в нём есть ошибка: для числа 9999 он даёт неверный ответ. Исправьте код, чтобы он выводил:
9999 has 4 digitsНе меняйте само число и последнюю инструкцию print.
Гипотеза Коллатца входит в число знаменитых математических задач. Возьмите любое положительное целое число. Если оно чётное, разделите его на 2. Если нечётное, умножьте на 3 и прибавьте 1. Повторяйте, пока не получите 1.
Начните с n = 6, выведите каждое значение последовательности (включая 6 и 1), а затем выведите, сколько шагов это заняло.
Ожидаемый вывод:
6
3
10
5
16
8
4
2
1
Steps: 8Итоги: циклы while в Python
Всё, что вы узнали о циклах while:
| Шаблон | Что делает | Пример |
|---|---|---|
while condition: | Повторяет, пока условие не станет False | while count > 0: |
while True: + break | Работает бесконечно, выход вручную | Игровые циклы, меню |
| Цикл со счётчиком | Считает вверх или вниз до цели | while count <= 10: |
| Цикл-накопитель | Накапливает сумму или результат | while total < 100: |
| Цикл проверки | Повторяет, пока ввод не станет корректным | while age <= 0: |
Главные правила:
Falsebreak немедленно завершает циклfor, когда знаете, что перебиратьwhile, когда нужно повторять, пока не изменится условиеЧто дальше?
Вы уже видели, как break досрочно завершает цикл. Но есть ещё две инструкции управления циклом: continue (пропустить остаток текущей итерации) и pass (ничего не делать). В следующем уроке, [break, continue и pass в Python](/python/python-break-continue-pass), вы освоите все три и узнаете, когда какая из них подходит лучше всего.