01Цикл с предусловием
while выполняет тело цикла, пока условие истинно. Условие проверяется перед каждой итерацией — одним повторением тела. Если оно сразу ложно, тело не выполнится ни разу.
while условие:
команда_1
команда_2
После условия ставится двоеточие. Отступ объединяет команды в тело цикла: обычно это четыре пробела. Команда без отступа после тела выполняется уже после завершения цикла. Не смешивайте пробелы и табуляцию.
n = 1
while n <= 5:
print(n)
n += 1
Сначала n = 1. Проверяем n <= 5: это True. Выводим n, увеличиваем его на 1 и возвращаемся к проверке. Так выводятся числа от 1 до 5. При n = 6 условие становится False, и цикл прекращается.
Важно: условие должно когда-нибудь стать ложнымВ этом примере n не меняется. Программа будет печатать 1 бесконечно:
n = 1
while n <= 5:
print(n)
В заданиях такой запуск автоматически остановится. В обычной программе нужно исправить условие или изменение переменной.
Обратный отсчёт
n = 5
while n > 0:
print(n)
n -= 1
print("Старт!")
На экране появятся 5, 4, 3, 2, 1 и «Старт!». Последняя команда находится вне цикла и выполнится один раз.
02Составной оператор присваивания
Для чисел запись x += 1 означает то же, что x = x + 1: увеличить x на единицу и сохранить результат в x.
x += 1 # x = x + 1
x -= 1 # x = x - 1
x *= 2 # x = x * 2
x /= 2 # x = x / 2 (обычное деление)
x //= 2 # x = x // 2 (целочисленное деление)
x %= 2 # x = x % 2 (остаток)
x **= 2 # x = x ** 2 (степень)
В циклах особенно часто встречаются += и -=: они изменяют счётчик или приближают завершение цикла.
i = 0
while i < 5:
print(i)
i += 1
Здесь выводятся числа от 0 до 4. Число 5 уже не удовлетворяет условию i < 5.
03Подсчёт подходящих элементов
Счётчик хранит количество найденных элементов. До цикла задаём count = 0. Для каждого подходящего элемента выполняем count += 1.
count = 0
n = int(input())
while n != 0:
if n > 0:
count += 1
n = int(input())
print(count)
Ноль завершает ввод и не является обычным элементом последовательности. Счётчик увеличивается только для положительных чисел.
Трассировка: ввод 4, −2, 7, 0
| Введено n | Действие | count |
|---|
| 4 | Положительное → +1 | 1 |
| −2 | Пропускаем | 1 |
| 7 | Положительное → +1 | 2 |
| 0 | Выходим из цикла | 2 |
Обрати вниманиеНовое число читается на каждой итерации, даже если оно отрицательное. Поэтому второй input() находится вне if, но внутри while.
04Сигнал остановки
Если количество данных заранее неизвестно, выбирают специальное завершающее значение — сигнал остановки. Например, ноль для чисел или пустую строку для текста.
n = int(input())
while n != 0:
print(n)
n = int(input())
Ту же идею можно записать с помощью бесконечного цикла и явного выхода:
while True:
n = int(input())
if n == 0:
break
print(n)
break немедленно завершает ближайший цикл. Проверка стоит перед print(), поэтому ноль не выводится. Значение-сигнал обычно не включают в вычисления, если условие задачи не требует обратного.
05Поиск минимума и максимума
Храните лучший результат из уже прочитанных элементов. Начальное значение максимума удобно взять из первого реального элемента. Искусственное число вроде −1000000000 может оказаться больше всех входных чисел и дать неверный ответ.
n = int(input())
maximum = n
n = int(input())
while n != 0:
if n > maximum:
maximum = n
n = int(input())
print(maximum)
Условие этого примераДо завершающего нуля обязательно есть хотя бы одно число. Для пустой последовательности максимум не определён — такой случай нужно обрабатывать отдельно.
Для минимума идея та же: храним minimum и обновляем его, если n < minimum.
Как найти второй максимум?
Храните maximum и second_maximum. Если пришёл новый максимум, прежний переходит на второе место. Иначе сравните число со вторым максимумом. Начальные значения можно получить из первых двух элементов.
Например, после 5 и 2 храним (5, 2). Приходит 4 → (5, 4), затем 8 → (8, 5). Второй максимум равен 5. В практическом задании наибольший элемент встречается один раз.
06Моржовый оператор :=
Оператор := появился в Python 3.8. Он позволяет присвоить значение переменной прямо внутри выражения.
Обычная запись
s = input()
while s != "":
print(len(s))
s = input()
Запись с :=
while (s := input()) != "":
print(len(s))
Сначала выполняется input(), затем его результат присваивается s и сразу сравнивается с пустой строкой. Скобки показывают нужный порядок действий.
Необязательно писать корочеДля начинающих обычная запись часто проще и понятнее. Любой из этих вариантов подходит для практики.
07Алгоритм Евклида
НОД — наибольший общий делитель: самое большое положительное число, на которое оба числа делятся без остатка. Для положительных целых a и b можно повторять замену пары на b и остаток от деления a на b.
a = int(input())
b = int(input())
while b != 0:
a, b = b, a % b
print(a)
В строке присваивания сначала вычисляется вся правая часть со старыми значениями a и b, а затем обновляются обе переменные.
| a | b | a % b | Новая пара |
|---|
| 48 | 18 | 12 | (18, 12) |
| 18 | 12 | 6 | (12, 6) |
| 12 | 6 | 0 | (6, 0) |
Общие делители пары не меняются при замене a на остаток a % b. Остатки уменьшаются, пока очередной не станет нулём. Тогда b = 0, цикл завершается, а a содержит НОД. Для 48 и 18 ответ — 6.