1Зачем программе нужны циклы?

🧭
Маршрут по теме

Первое занятие: for и range; while можно прочитать для сравнения. Второе: счётчик и накопитель, затем if внутри цикла. Третье: ввод до сигнала и работа с цифрами.

Перед новой задачей выполни короткое упражнение в соответствующем разделе. break, continue и вложенные циклы оставь на следующий этап.

В теме 1 команды выполнялись по порядку. В теме 2 программа выбирала действие с помощью if. Теперь научим её повторять действия: печатать номера, обрабатывать измерения, читать данные, пока они не закончатся.

Представь, что нужно вывести слово «Старт» три раза. Три одинаковые команды пока выглядят терпимо. Но если повторений сто или их число вводит пользователь, перечисление команд перестаёт быть удобным. Цикл позволяет записать повторяемую часть один раз.

Иллюстрация двух способов повторения: while проверяет условие, for перебирает значения по одному
Два способа организовать повторение. Концептуальная иллюстрация; точные схемы выполнения разбираем ниже.
Повторение без цикла
print("Старт")
print("Старт")
print("Старт")
Тот же результат с циклом
for attempt in range(3):
    print("Старт")
📖
Новые слова
Тело цикла — команды, которые повторяются. Итерация — один проход тела. Условие продолжения — проверка, которая разрешает следующий проход.

while — «пока»

Повторяем тело, пока условие истинно. Удобен, когда заранее неизвестно число проходов: например, ввод данных до сигнала.

for — «для каждого»

Берём элементы последовательности по очереди. Удобен для заданного числа повторений или перебора диапазона номеров.

Подумай: if и while проверяют условие. Чем они отличаются?

if выбирает ветку один раз. while после тела возвращается к проверке и может выполнить тело снова.

2Цикл while: условие перед телом

Слово while означает «пока». Сначала программа проверяет условие. При значении True выполняет всё тело и возвращается к проверке. При False пропускает тело и продолжает выполнять команды после цикла.

Условие записывается после while, строка заканчивается двоеточием. Команды тела имеют одинаковый отступ. Для каждого уровня используем четыре пробела, как в теме об условиях.

Структура while — запись для чтения, не готовая программа
while условие:
    команда_тела
    другая_команда_тела
команда_после_цикла
🔁 Как выполняется while
Начальное состояниеУсловие?Тело циклаДанные могут изменитьсяTrueFalseНовая проверкаКомандыпосле цикла
Напечатать номера 1, 2, 3
number = 1
while number <= 3:
    print(number)
    number += 1
print("Конец")

Переменная number хранит текущий номер. Запись number += 1 — сокращение для number = number + 1: прочитать старое значение, прибавить единицу и сохранить новое.

Обрати внимание: print("Конец") стоит без отступа. Он выполняется один раз после завершения всего цикла, а не после каждого номера.

ПроверкаУсловие number ≤ 3Действиеnumber после тела
11 ≤ 3 → TrueНапечатать 1, увеличить2
22 ≤ 3 → TrueНапечатать 2, увеличить3
33 ≤ 3 → TrueНапечатать 3, увеличить4
44 ≤ 3 → FalseТело не выполняется4
✅
Три прохода, но четыре проверки
Последняя проверка нужна, чтобы обнаружить конец. После выхода number равен 4, хотя внутри тела печатались только 1, 2, 3.
Подумай: Что изменится, если начальное number равно 7?

Условие 7 ≤ 3 сразу ложно. Ни одного номера напечатано не будет, но команда после цикла напечатает «Конец».

Видео: как работает while1 минута 54 секунды

Проследи за указателем строки и значением number: три прохода тела, четыре проверки условия и выход из цикла.

Открыть ролик отдельно · Русские субтитры доступны в настройках плеера.
Предскажи вывод

Прочитай код сверху вниз. Назови напечатанные числа и значение number после цикла.

number = 1
while number <= 3:
    number += 1
    print(number)
Проверить рассуждение

Вывод: 2, 3, 4 — каждое число с новой строки. После цикла number равен 4. Увеличение стоит перед print, но условие проверяется до увеличения.

3Тренажёр while: программа под микроскопом

Не запускай весь цикл в уме сразу. Отдельно отслеживай проверку, вывод и изменение переменной. В тренажёре каждая кнопка выполняет одну строку, а таблица хранит историю.

Перед опытом предскажи вывод и число проходов. Потом проверь старт 1, старт 3 и старт 5. Последний вариант помогает увидеть, что тело может не выполниться.

🔬 Трассировка while ПО СТРОКАМ
Состояние выполнения
Вывод программы
Пока пусто
ШагСтрока / результатnumberПроходов тела
Подумай: Что изменится, если увеличить number перед print, а не после?

В этом коде сначала проверка, затем print, затем увеличение. Если переставить команды, изменится вывод: например, увеличение перед print даст другие напечатанные числа. Всегда читай тело сверху вниз.

4Цикл for: берём значения по очереди

for не означает «прибавляй единицу». Он означает «для каждого элемента». На каждом проходе переменная получает следующий элемент последовательности. В этой теме последовательность чисел задаёт range.

Четыре повтора сообщения
for repeat_number in range(4):
    print("Проверка")
print("Все повторы завершены")

range(4) предоставляет числа 0, 1, 2, 3. Тело выполнится четыре раза. Переменная repeat_number в этом примере не используется в выводе: она нужна, чтобы получать элементы диапазона.

Если текущий номер нужен, его можно использовать прямо в теле. Имя переменной выбираешь сам: i, attempt, floor. Короткое имя i — обычная договорённость, а не специальное слово Python.

Переменная цикла участвует в вычислении
for floor in range(1, 4):
    print("Этаж", floor)
ПроходfloorЧто печатает программа
11Этаж 1
22Этаж 2
33Этаж 3
⚠️
Не увеличивай переменную for вручную
Следующее значение приходит из диапазона автоматически. Команда floor += 1 внутри тела не меняет последовательность, которую подготовил range. Такая запись часто делает код непонятным.
Подумай: Сколько раз напечатается сообщение при range(0)?

Ни разу: диапазон пуст. Команды после цикла всё равно выполнятся.

5Функция range: старт, стоп и шаг

range задаёт целочисленный диапазон. У него три формы записи. Главная граница: stop не входит в диапазон. Это правило действует и при движении вперёд, и при движении назад.

ФормаЗначение параметровПример
range(stop)Старт 0, шаг +1range(5) → 0, 1, 2, 3, 4
range(start, stop)Старт задан, шаг +1range(2, 6) → 2, 3, 4, 5
range(start, stop, step)Старт и шаг заданыrange(2, 9, 3) → 2, 5, 8
📍 Верхняя граница остаётся за диапазоном

range(2, 6)

2 · старт3456 · стоп, исключён

Чтобы вывести числа от 1 до n включительно, стопом задают n + 1. Чтобы идти назад, нужен отрицательный шаг. При отрицательном шаге значения продолжаются, пока они больше стопа.

Включить число n в вывод
n = int(input())
for number in range(1, n + 1):
    print(number)
Движение назад: 6, 4, 2
for number in range(6, 0, -2):
    print(number)
ДиапазонРезультатПочему
range(5, 2)ПустоШаг +1 не ведёт от 5 к 2
range(2, 5, -1)ПустоОтрицательный шаг не ведёт от 2 к 5
range(3, 3)ПустоСтарт уже равен исключённому стопу
range(0, 5, 0)Ошибка ValueErrorШаг 0 запрещён
🐍
В Python 3 range — не список
Это отдельный объект диапазона. print(range(5)) покажет range(0, 5), а не все его элементы. Чтобы вывести числа, перебери диапазон циклом.
🧪 Лаборатория range ИЗМЕНЯЙ ПАРАМЕТРЫ
Какие значения получит переменная for?

Визуализация: целые параметры от −1000 до 1000; отображаются первые 50 значений. У самого Python такого ограничения диапазона нет.

Подумай: Как задать 9, 6, 3 без включения 0?

range(9, 0, -3). Следующее значение было бы 0, но оно совпадает со стопом и не включается.

Подбери диапазон

Нужно напечатать 5, 4, 3, 2, 1. Какие аргументы range нужны?

for number in range(...):
    print(number)
Проверить рассуждение

range(5, 0, -1): старт 5, стоп 0 исключён, шаг −1.

6Как выбрать между while и for

Один и тот же результат нередко можно получить разными циклами. Отличается то, где хранится правило повторения. В while ты описываешь условие и изменение данных. В for задаёшь последовательность элементов.

Номера 1–3 через while
number = 1
while number <= 3:
    print(number)
    number += 1
Номера 1–3 через for
for number in range(1, 4):
    print(number)
СитуацияОбычно удобнееОбъяснение
Нужно 10 повторенийforЧисло проходов задано
Нужно перебрать номера от a до bforЕсть числовой диапазон
Читать значения до сигналаwhileЧисло вводов заранее неизвестно
Менять число, пока оно больше 0whileПродолжение определяется текущим состоянием
🧭
Это ориентир, а не запрет
while тоже может считать фиксированное число проходов. for может перебирать последовательности, длина которых тебе заранее неизвестна. Выбирай читаемую запись, а не механическое правило.
Выбери цикл и объясни

1. Напечатать сообщение 8 раз. 2. Читать измерения до первого −999. 3. Удваивать запас, пока он меньше цели.

Проверить рассуждение

1. Обычно for с range(8). 2. Обычно while: заранее неизвестно, когда придёт сигнал. 3. Обычно while: продолжение зависит от текущего запаса. Другой цикл допустим, если ты можешь объяснить его работу.

7Счётчик, сумма и произведение

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

Счётчик хранит количество событий: например, сколько измерений было положительными. Накопитель хранит общий результат: сумму значений или произведение.

РольНачалоОбновление
Счётчикcount = 0count += 1 при нужном событии
Суммаtotal = 0total += value
Произведениеproduct = 1product *= value
Сложим три показания
total = 0
for sample in range(3):
    value = int(input())
    total += value
print(total)

Пусть вводятся 4, −2, 7. После первого прохода сумма 4, после второго — 2, после третьего — 9. Переменная sample считает проходы, value хранит новое измерение, а total — сумму уже обработанных значений.

ПроходНовое valuetotal до сложенияtotal после
1404
2−242
3729
⚠️
Сумму нельзя обнулять в теле
Если переместить total = 0 внутрь цикла, на каждом проходе потеряется предыдущая сумма. Итог окажется равен последнему значению.
Подумай: Почему произведение начинают с 1, а не с 0?

При умножении на 0 любой результат станет 0. Единица сохраняет первый множитель. Начальные значения выбираются по смыслу операции, а не по привычке.

Как цикл собирает сумму

Каждое измерение проходит через цикл. Сумма хранит результат уже обработанных чисел. Сначала предскажи итог, затем запусти разбор.

До 8 целых чисел от −1000 до 1000. Оставь поле пустым, чтобы проверить ноль измерений. После изменения нажми «Сначала».

Выполняемая строка

Входные измерения
Текущее value—
Накопленная total—
Сумма ещё не задана
Обработано: 0 из 3
Вывод программы
Пока пусто
Нажми «Шаг» или «Воспроизвести».
Почему итоговый print стоит после цикла?

Внутри цикла мы получили бы промежуточные суммы после каждого измерения. После цикла выводится один итог. При нуле измерений он равен 0.

Найди и исправь ошибку

Вводятся 4, −2, 7. Программа должна вывести 9, но выводит 7. Какую строку нужно перенести и куда?

for sample in range(3):
    total = 0
    value = int(input())
    total += value
print(total)
Проверить рассуждение

Перенеси total = 0 перед for, без отступа. Внутри тела она стирает накопленную сумму на каждом проходе. Проверь оба режима в анимации выше.

8Условие внутри цикла

Цикл может обрабатывать много значений, а if — выбирать, какие из них учитывать. На каждом проходе условие проверяется заново для текущего значения.

Дано число измерений n. Затем вводятся сами измерения. Посчитаем, сколько из них строго больше нуля.

Цикл + условие + счётчик
n = int(input())
count = 0
for sample in range(n):
    value = int(input())
    if value > 0:
        count += 1
print(count)
СтрокаОтступКогда выполняется
for sample in range(n):0 пробеловНачинает перебор
value = int(input())4 пробелаНа каждом проходе
if value > 0:4 пробелаДля каждого нового value
count += 18 пробеловТолько при value > 0
print(count)0 пробеловОдин раз после цикла
📊
Ноль не положительный
Если ввод: 5, затем −2, 0, 7, 1, −1 — положительных значений два. Первое число 5 задаёт количество данных и не относится к измерениям.
Подумай: Если n равно 0, что выведет программа?

0. Измерения не запрашиваются: range(0) пуст, счётчик остаётся нулевым.

9Ввод до сигнала: число повторений неизвестно

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

Чтобы проверить сигнал, сначала надо получить первое число. После обработки нужен новый ввод: иначе цикл будет проверять одно и то же значение. Сам сигнал не входит в сумму.

Сумма чисел до первого нуля
total = 0
value = int(input())
while value != 0:
    total += value
    value = int(input())
print(total)
ВводРольНовая сумма
5Первое данное5
−2Следующее данное3
8Следующее данное11
0Сигнал: тело не выполняется11
✅
Если первым введён 0
Условие сразу ложно. Ни одного числа не обработано, сумма остаётся 0. Такой случай называется пустой последовательностью.
📥 Лента ввода до нуля ЧИТАЕМ ПО ОДНОМУ

Впиши числа через пробел. Ноль — обязательный сигнал. Числа после первого нуля программа уже не читает.

Обработано значений · сумма
Подумай: Почему данные после первого 0 остаются непрочитанными?

На 0 проверка value != 0 становится ложной. Тело и находящийся в нём новый input больше не выполняются.

Восстанови порядок команд

Ввод: 5, −2, 0. Какие два места должны содержать input, чтобы сумма стала 3 и цикл завершился?

total = 0
value = ...
while value != 0:
    total += value
    value = ...
print(total)
Проверить рассуждение

В обоих местах нужно int(input()). Первый ввод нужен для первой проверки; ввод в конце тела даёт следующее значение. Без него условие всё время проверяет прежнее число.

10Арифметический цикл: работа с цифрами

Цикл может завершаться не только после ввода сигнала. Иногда на каждом проходе меняется само число. Для неотрицательного целого числа number % 10 даёт последнюю цифру, а number // 10 убирает её.

Пример ниже вычисляет сумму цифр. Здесь нас интересует процесс постепенного уменьшения числа: когда все цифры убраны, число становится нулём.

Сумма цифр неотрицательного целого числа
number = int(input())
digit_sum = 0
while number > 0:
    digit = number % 10
    digit_sum += digit
    number //= 10
print(digit_sum)
number до проходаПоследняя цифраНовая суммаnumber после //= 10
4077740
40074
44110
🔎
Подумай о нуле и сохранении исходных данных
Для суммы цифр 0 ответ 0, поэтому пустое тело подходит. Но число цифр в записи 0 равно 1 — это другой смысл задачи. Кроме того, после цикла number уже равен 0. Если нужно сохранить исходное число, работай с отдельной копией.
Подумай: Почему нельзя заменить //= 10 на /= 10?

Обычное деление создаёт дробное число. Здесь нужны целые числа с отброшенной последней цифрой; эту операцию выполняет целочисленное деление // .

11Отладка: почему цикл ведёт себя неправильно

При ошибке полезнее восстановить несколько проходов на бумаге, чем случайно менять числа. Запиши начальные значения, результат условия, выполненные строки и состояние после тела. Начинай с маленьких входных данных.

Ошибка: переменная условия не меняется
number = 1
while number <= 3:
    print(number)
⏹️
Бесконечный цикл
number всё время равен 1, поэтому условие не станет ложным. В IDLE нажми Ctrl+C в окне Shell или выбери Shell → Interrupt Execution. Потом исправь причину; повторный запуск того же кода её не устранит.
СимптомВероятная причинаПолезная проверка
Тело не выполнилосьУсловие сразу ложно / диапазон пустПроверь первое состояние
Одно число потерялосьСтоп range исключён / знак < вместо ≤Возьми n = 1
Итог печатается много разИтоговый print внутри телаПосмотри уровень отступа
Сумма равна последнему числуОбнуление накопителя в телеЗапиши сумму после двух проходов
while не заканчиваетсяНет изменения данных / выходаМеняется ли условие по смыслу?
Вывод начинается не с того числаИзменение стоит перед printПроверь порядок команд
IndentationError / SyntaxErrorОтступы / пропущенное двоеточиеПроверь заголовок и границы тела
1

Создай файл в IDLE

File → New File. Введи код с одинаковыми отступами; не смешивай табуляцию и пробелы.

2

Сохрани и запусти

File → Save, имя с расширением .py. Run → Run Module или F5. Ввод появляется в окне Shell.

3

Проверь границы

Пустой диапазон, одно значение, крайняя граница; для последовательности — сразу сигнал, отрицательные числа и нули по условию.

12Дополнительно: break, continue и вложенные циклы

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

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

break: прекращаем перебор при выполнении условия
for number in range(1, 7):
    if number == 4:
        break
    print(number)

Вывод: 1, 2, 3. На значении 4 команда break завершит цикл раньше print.

continue: один проход пропускает print
for number in range(1, 5):
    if number == 2:
        continue
    print(number)

Вывод: 1, 3, 4. Цикл не завершён: только проход со значением 2 не дошёл до print.

⚠️
Осторожно с continue в while
Если continue пропускает строку, которая должна изменить переменную условия, программа может застрять. Проверяй, возможно ли изменение на каждой ветке.
Внутренний цикл целиком выполняется для каждого row
for row in range(2):
    for column in range(3):
        print(row, column)

Будет шесть строк: 0 0; 0 1; 0 2; 1 0; 1 1; 1 2. Сначала внутренний цикл заканчивает все свои значения для row = 0, затем начинается новый внутренний перебор для row = 1.

Подумай: Если внутренний цикл имеет 4 прохода, а внешний 3, сколько раз выполнится команда внутреннего тела?

12 раз: для каждого из трёх внешних проходов происходит четыре внутренних. Это верно для показанной формы, где диапазоны фиксированы и досрочного выхода нет.

13Самопроверка: 10 вопросов с объяснениями

Сначала выбери ответ самостоятельно. Пояснение относится именно к выбранному варианту; можно сбросить вопрос и попробовать ещё раз.

1. while проверяет условие…
2. Какие числа получит i в range(2, 5)?
3. range(7, 0, -3) даёт…
4. Что происходит при range(1, 5, 0)?
5. Чему равно number после завершения этого цикла?
number = 1
while number <= 3:
    number += 1
6. Где должно стоять total = 0 для накопления суммы?
7. Ввод: 0. while value != 0 не выполняет тело. Какова сумма с начальным total = 0?
8. Что даст range(5, 2) при шаге по умолчанию?
9. Для n измерений где должен стоять print(total), чтобы вывести один итог?
10. Чем break отличается от continue?

Ответов пока нет.

14Практика и источники

Теория рассчитана на несколько занятий. Для первого блока достаточно for, range, счётчика и накопителя. Во втором блоке добавляются while, сигнал окончания и арифметическая обработка числа. Дополнительные задачи требуют совместить несколько идей.

Практика открыта: 12 задач C1–C12. Сохраняй решения в отдельных файлах .py, проверяй их на примерах, собственных тестах и в сервисе проверки.

Практика · 12 задач на циклы → Проверить решения →

📚
Материалы, на которые опирается тема

Изложение, визуальные разборы и задачи адаптированы для этого школьного курса. Синтаксис соответствует Python 3.

Следующая тема: строки

После циклов переходим к обработке текста: методы строк, примеры применения и задачи.

Тема 4: Строки →