Перейти к содержимому
Editor

Цикл while в Python: когда цикла for недостаточно

Начальный20 min5 упр.65 XP

Этот урок переведён с английского оригинала.Read in EnglishLeer en españolСообщить об ошибке в переводе

0/5 упр.

Торговый автомат не знает, сколько монет вы в него опустите. Он терпеливо ждёт: «пока сумма меньше цены, принимать монеты». Цикл for ему не подойдёт, потому что количество итераций заранее неизвестно. Ему нужен цикл while.

В этом уроке вы научитесь использовать циклы while там, где действие нужно повторять, пока не изменится условие. Вы также узнаете, как избежать бесконечных циклов, как досрочно выйти из цикла с помощью break и когда выбирать while вместо for.

К концу урока у вас в арсенале будет два вида циклов: for для перебора известных коллекций и while для повторения, пока не выполнится условие.

Как работает цикл while в Python?

Цикл while проверяет условие перед каждой итерацией. Если условие равно True, выполняется тело цикла. Затем Python возвращается в начало и снова проверяет условие. Так повторяется, пока условие не станет False.

Представьте охранника у двери, который проверяет ваш пропуск каждый раз, когда вы пытаетесь войти. Пока пропуск действителен, вас пропускают. Как только срок его действия истекает, дверь для вас закрыта.

Простой цикл while, который считает до 5
count = 1
while count <= 5:
print(count)
count += 1
print("Done!")
# Output:
# 1
# 2
# 3
# 4
# 5
# Done!
Вывод
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 отлично подходят для задач, где данные нужно обрабатывать до достижения определённой цели. Вы задаёте условие, и цикл продолжает работу, пока цель не достигнута.

Подсчёт: сколько удвоений нужно, чтобы превысить 1000?
# How many doubles of 1 to exceed 1000?
value = 1
doubles = 0
while value <= 1000:
value = value * 2
doubles += 1
print(f"After {doubles} doubles, the value is {value}")
# Output:
# After 10 doubles, the value is 1024
Вывод
After 10 doubles, the value is 1024

Такую задачу непросто записать циклом for, ведь мы не знаем заранее, сколько удвоений понадобится. Цикл while работает, пока значение не превысит 1000, а мы считаем, сколько раз он выполнился.

Накопление: суммируем, пока не превысим 100
# Summing numbers until the total reaches 100
total = 0
number = 1
while total < 100:
total += number
number += 1
# number was incremented one extra time after the last addition
print(f"Sum of 1 to {number - 1} = {total}")
# Output:
# Sum of 1 to 14 = 105
Вывод
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 += 1
Намеренный бесконечный цикл с break
while True:
    answer = "yes"
    print("Looping...")
    if answer == "yes":
        break
print("Escaped!")

while True создаёт цикл, который по умолчанию работает вечно. Инструкция break немедленно завершает цикл и передаёт управление первой строке после него. Этот шаблон очень часто встречается в меню, игровых циклах и при проверке ввода.

Игра «Угадай число» на while True + break
# Simulating a guessing game (without real input)
secret = 7
guesses = [3, 9, 5, 7] # simulated guesses
attempt = 0
while True:
guess = guesses[attempt]
attempt += 1
print(f"Guess {attempt}: {guess}")
if guess == secret:
print(f"Correct! You got it in {attempt} tries!")
break
elif guess < secret:
print("Too low!")
else:
print("Too high!")
# Output:
# 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!
Вывод
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 связано с проверкой ввода: программа снова и снова запрашивает данные, пока пользователь не введёт что-то допустимое. Именно этот шаблон стоит за каждой формой с сообщением «введите корректный адрес электронной почты».

Цикл проверки ввода
# Simulating input validation (without real input)
test_inputs = ["abc", "-5", "0", "25"] # simulated user inputs
input_index = 0
age = -1 # start invalid
while age <= 0 or age > 120:
user_input = test_inputs[input_index]
input_index += 1
print(f"Enter your age: {user_input}")
if user_input.isdigit():
age = int(user_input)
else:
print("Please enter a number.")
continue
if age <= 0 or age > 120:
print("Age must be between 1 and 120.")
print(f"Your age: {age}")
# Output:
# Enter your age: abc
# Please enter a number.
# Enter your age: -5
# Age must be between 1 and 120.
# Enter your age: 0
# Age must be between 1 and 120.
# Enter your age: 25
# Your age: 25
Вывод
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, когда...
Вы перебираете коллекциюВы ждёте, пока изменится условие
Вы знаете, сколько раз повторятьВы НЕ знаете, сколько раз повторять
Вы обрабатываете каждый элемент спискаВы повторяете, пока что-то не произойдёт
Пример: вывести имя каждого студентаПример: спрашивать, пока ввод не станет корректным
for и while: правильный инструмент для задачи
# FOR loop: you know the items to process
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(f"I like {fruit}")
print()
# WHILE loop: you don't know when to stop
num = 1
while num < 100:
num = num * 3
print(num, end=" ")
print(f"\nFirst power of 3 >= 100: {num}")
# Output:
# I like apple
# I like banana
# I like cherry
#
# 3 9 27 81 243
# First power of 3 >= 100: 243
Вывод
I like apple
I like banana
I like cherry

3 9 27 81 243 
First power of 3 >= 100: 243

Цикл for идеально подходит для списка фруктов: мы точно знаем, что перебираем. Цикл while идеально подходит для степеней тройки: мы не знаем заранее, сколько умножений понадобится, чтобы превысить 100.

Цикл while (лишняя сложность)
names = ["Alice", "Bob", "Charlie"]
i = 0
while i < len(names):
    print(names[i])
    i += 1
Цикл for (коротко и ясно)
names = ["Alice", "Bob", "Charlie"]
for name in names:
    print(name)

Практические упражнения

Теперь ваша очередь писать циклы while! Эти упражнения посвящены задачам, где циклы while проявляют себя лучше всего: неизвестное число итераций, остановка по условию и накопление.

Помните: в цикле while что-то должно меняться. Если ваш цикл работает вечно, проверьте, обновляете ли вы переменную из условия.

Упражнение 1: таймер обратного отсчёта
Напишите код

С помощью цикла while выведите обратный отсчёт от 5 до 1, а в последней строке выведите «Blastoff!».

Ожидаемый вывод:

5
4
3
2
1
Blastoff!
# Create a countdown from 5 to 1, then print "Blastoff!"
Упражнение 2: поиск степени двойки
Напишите код

Начните с 1 и удваивайте число, пока оно не превысит 500. Выводите каждое значение по ходу дела (включая первое значение больше 500). Затем выведите итоговый результат.

Ожидаемый вывод:

1
2
4
8
16
32
64
128
256
512
First power of 2 over 500: 512

Подсказка: используйте цикл while True с break после того, как значение превысит 500.

value = 1
# Keep doubling and printing until value exceeds 500
Упражнение 3: предскажите вывод
Угадайте вывод

Не запуская код, предскажите, что именно он выведет. Внимательно пройдите по каждой итерации и следите, когда проверяется условие и когда меняется x.

Затем запустите код и проверьте свой ответ.

x = 10
while x > 1:
x = x // 2
print(x)
print("done")
Упражнение 4: исправьте ошибку в счётчике цифр
Исправьте ошибку

Этот код должен посчитать, сколько цифр в числе, многократно деля его на 10. Но в нём есть ошибка: для числа 9999 он даёт неверный ответ. Исправьте код, чтобы он выводил:

9999 has 4 digits

Не меняйте само число и последнюю инструкцию print.

number = 9999
original = number
digits = 0
while number >= 10:
number = number // 10
digits += 1
print(f"{original} has {digits} digits")
Упражнение 5: последовательность Коллатца
Напишите код

Гипотеза Коллатца входит в число знаменитых математических задач. Возьмите любое положительное целое число. Если оно чётное, разделите его на 2. Если нечётное, умножьте на 3 и прибавьте 1. Повторяйте, пока не получите 1.

Начните с n = 6, выведите каждое значение последовательности (включая 6 и 1), а затем выведите, сколько шагов это заняло.

Ожидаемый вывод:

6
3
10
5
16
8
4
2
1
Steps: 8
n = 6
steps = 0
# Print n, then apply Collatz rules until n reaches 1
# Count each transformation as a step

Итоги: циклы while в Python

Всё, что вы узнали о циклах while:

ШаблонЧто делаетПример
while condition:Повторяет, пока условие не станет Falsewhile count > 0:
while True: + breakРаботает бесконечно, выход вручнуюИгровые циклы, меню
Цикл со счётчикомСчитает вверх или вниз до целиwhile count <= 10:
Цикл-накопительНакапливает сумму или результатwhile total < 100:
Цикл проверкиПовторяет, пока ввод не станет корректнымwhile age <= 0:

Главные правила:

  • Условие while проверяется ПЕРЕД каждой итерацией
  • Что-то внутри цикла должно рано или поздно сделать условие False
  • break немедленно завершает цикл
  • Используйте for, когда знаете, что перебирать
  • Используйте while, когда нужно повторять, пока не изменится условие
  • Всегда проверяйте, что ваш цикл while действительно может завершиться
  • Что дальше?

    Вы уже видели, как break досрочно завершает цикл. Но есть ещё две инструкции управления циклом: continue (пропустить остаток текущей итерации) и pass (ничего не делать). В следующем уроке, [break, continue и pass в Python](/python/python-break-continue-pass), вы освоите все три и узнаете, когда какая из них подходит лучше всего.

    Похожие уроки

    Урок был полезен?