До сих пор ваши программы выполнялись строго по одному разу сверху вниз: если нужно было напечатать пять строк, вы писали пять команд print(). Это работает, пока строк немного. А если нужно напечатать сто чисел? Или пересчитать сумму всех покупок, которых может быть и три, и триста? Копировать команду сто раз — не выход.
Для таких задач в программировании придумали циклы — конструкции, которые повторяют один и тот же кусок кода снова и снова, пока это нужно. В этом уроке разберём первый и самый гибкий вид цикла в Python — while. С его помощью можно посчитать сумму любого количества чисел, отсчитать время до старта или проверять данные, пока пользователь не введёт что-то подходящее.
while устроен так же: он повторяет действие, пока условие остаётся верным, а сколько раз это будет — решает не программист заранее, а сами данные во время выполнения.
Цикл while: повторяй, пока верно условие
Простыми словами: представьте, что вы поднимаетесь по лестнице и на каждой ступеньке спрашиваете себя «я уже дошёл до пятого этажа?». Пока ответ «нет» — делаете ещё шаг и спрашиваете снова. Как только ответ становится «да» — останавливаетесь. Вы не считаете шаги заранее, вы просто повторяете одно и то же действие, пока условие «я не дошёл» остаётся верным.
Официально это называется цикл while (от английского «пока») — конструкция, которая проверяет условие (то самое выражение, что даёт True или False, как в if), и пока оно True, раз за разом выполняет привязанный к нему код, который называют телом цикла. Как только условие становится False, Python пропускает тело цикла и переходит к коду после него.
i = 1
while i <= 5:
print(i)
i += 1
Разбираем построчно:
i = 1 — переменная, которая будет отслеживать, на каком шаге мы находимся. Такую переменную называют счётчиком. Стартуем с 1.i <= 5 — условие цикла, ровно такое же сравнение, как вы уже писали в if. Пока оно True, цикл продолжается.if. Он открывает тело цикла.print(i) и i += 1 — тело цикла, сдвинутое вправо на 4 пробела, как и тело if. Это и есть тот самый повторяющийся код: сначала печатаем текущее значение i, потом увеличиваем его на 1.Выполняется это так: Python проверяет i <= 5 (1 ≤ 5, верно) — печатает 1, увеличивает i до 2. Снова проверяет условие (2 ≤ 5, верно) — печатает 2, увеличивает до 3. И так далее, пока i не станет равно 6: тогда 6 <= 5 — это False, тело цикла больше не выполняется, и программа идёт дальше. На экране появится:
1
2
3
4
5
Важно понимать: условие проверяется перед каждым повторением, включая самое первое. Если бы i изначально было равно 10, тело цикла не выполнилось бы ни разу — ровно как if с ложным условием.
Счётчик можно не только увеличивать
Простыми словами: обратный отсчёт перед стартом ракеты идёт не «1, 2, 3», а «10, 9, 8». Счётчик здесь тоже меняется на каждом шаге, только не растёт, а уменьшается — и цикл заканчивается не когда число становится слишком большим, а когда оно становится слишком маленьким.
Официального отдельного термина для этого нет: это всё тот же счётчик, просто с другим направлением изменения и другим условием. Вместо i += 1 пишут i -= 1 (уменьшение, которое иногда называют декрементом), а условие цикла разворачивают: вместо «пока не больше» — «пока не меньше».
i = 3
while i >= 1:
print(i)
i -= 1
print("Старт!")
i = 3 — счётчик стартует с 3, потому что отсчёт идёт вниз от трёх.i >= 1 — условие «пока i не меньше 1». Как только i станет равно 0, условие даст False, и цикл остановится.i -= 1 — сокращённая запись i = i - 1, вы уже видели такие сокращения для +=. Уменьшает i на 1 на каждом шаге.print("Старт!") — эта строка написана БЕЗ отступа, значит, она уже не часть цикла. Python выполнит её один раз, когда цикл закончится.Вывод: 3, 2, 1, а затем — уже вне цикла — Старт!. Отступ здесь работает как граница: всё, что сдвинуто вправо после двоеточия, повторяется вместе с циклом; всё, что осталось на уровне while, выполнится один раз, до или после него.
Копилка: считаем итог внутри цикла
Простыми словами: представьте копилку. Каждый день вы кладёте в неё какую-то монету, и сумма внутри постепенно растёт: сегодня 10 рублей, завтра ещё 5 — и в копилке уже 15. Копилка сама по себе не считает по одной монете — вы каждый раз добавляете новую монету к тому, что там уже было.
В программировании такую переменную-копилку называют аккумулятором (от английского «накопитель»). Это обычная переменная, которую заводят ДО цикла с начальным значением (чаще всего 0), а внутри цикла на каждом шаге прибавляют к ней что-то новое — ровно как счётчик, только вместо «плюс один» прибавляется нужное значение.
i = 1
total = 0
while i <= 4:
total += i
i += 1
print(total)
total = 0 — копилка, завели её до цикла и положили в неё 0 — на старте там ничего нет.total += i — главная строка: к тому, что уже накоплено в total, прибавляем текущее значение счётчика i. Это выполняется на каждом шаге, поэтому total растёт постепенно.i += 1 — счётчик, как в разделе 1, продвигает нас к следующему числу.Проследим шаг за шагом: i=1 — total становится 0+1=1, затем i становится 2. i=2 — total становится 1+2=3, i становится 3. i=3 — total становится 3+3=6, i становится 4. i=4 — total становится 6+4=10, i становится 5. Теперь 5 <= 4 — False, цикл заканчивается, и print(total) выведет 10 — сумму чисел от 1 до 4.
Опасность цикла while: он может не остановиться
Простыми словами: если тот же будильник настроить так, что он звонит «пока не встанешь», но кнопка отключения будильника сломана — он прозвонит бесконечно, сколько бы вы ни лежали. С циклом while ровно такая же опасность: он не умеет сам догадаться, когда пора остановиться, он лишь честно проверяет условие. Если условие никогда не станет False, цикл будет выполняться вечно.
Официально это называется бесконечным циклом. Чаще всего он получается не специально, а по одной и той же причине: внутри тела цикла забыли изменить переменную, от которой зависит условие.
count < 3 никогда не станет False, потому что count нигде не меняется внутри цикла:
count = 0
while count < 3:
print(count)
# строку count += 1 забыли дописать
Программа будет печатать 0 снова и снова, пока вы сами не остановите выполнение. На платформе такую задачу оборвёт лимит времени, и вы получите ошибку по тайм-ауту — это верный признак, что где-то в цикле не меняется переменная из условия.Перед тем как запускать любой цикл while, полезно мысленно проверить: есть ли внутри тела строка, которая двигает переменную из условия в нужную сторону? Если её нет — цикл либо бесконечен, либо не выполнится ни разу.
Частые ошибки
i += 1 (или её аналог) написана ВНЕ тела цикла, без отступа, или потеряна вовсе. Проверяйте отступы: если строка с изменением счётчика не сдвинута вправо вместе с остальным телом, она не будет повторяться.= и ==. while i = 5: — это не сравнение, а попытка присваивания там, где Python ждёт условие, и он выдаст SyntaxError. Для сравнения нужен именно двойной знак: while i == 5:.while i < 5 и while i <= 5 — разные условия: первое остановится на i = 5, не выполнив тело для пятёрки, второе — выполнит тело и для неё. Если результат отличается от ожидаемого на одно значение, в первую очередь проверяйте именно знак сравнения в условии.Что важно запомнить
while условие:повторяет тело цикла, пока условие остаётсяTrue, и проверяет его перед КАЖДЫМ повторением, включая первое.- Счётчик — переменная, которая меняется на каждом шаге (
i += 1илиi -= 1) и обычно входит в условие цикла. - Аккумулятор — переменная, заведённая до цикла с начальным значением (часто 0), к которой на каждом шаге что-то прибавляют, чтобы накопить итог.
- Если переменная из условия ни разу не меняется внутри тела цикла, цикл станет бесконечным.
while i = 5— ошибка: для сравнения нужен двойной знак==, одиночный=означает присваивание.
Проверьте себя
5 вопросов
Сумма чисел от 1 до N
Дано число n. Напишите программу, которая вычисляет сумму всех чисел от 1 до n включительно с помощью цикла while, и сохраняет результат в переменную total.
Используйте переменную-счётчик i и переменную-накопитель total.
Обратный отсчёт
Дано число n. Напишите программу, которая печатает числа от n до 1 в порядке убывания, каждое на отдельной строке, с помощью цикла while.
Для n = 5 программа должна напечатать:
5 4 3 2 1
Сумма цифр числа
Дано целое число n. Напишите программу, которая вычисляет сумму его цифр с помощью цикла while и сохраняет результат в переменную total.
Например, для n = 12345 сумма цифр равна 1 + 2 + 3 + 4 + 5 = 15.
Подсказка: n % 10 даёт последнюю цифру числа, а n //= 10 отбрасывает эту цифру.
Сколько раз можно разделить на 2
Дано целое положительное число n. Напишите программу, которая считает, сколько раз число можно поделить нацело на 2, пока оно не станет равно 0, и сохраняет количество делений в переменную count.
Например, для n = 100: 100 → 50 → 25 → 12 → 6 → 3 → 1 → 0 -- это 7 делений, значит count = 7.