Цикл for и range
Представь, что нужно напечатать числа от 1 до 1000 или сложить 500 чисел из входных данных. Писать 1000 строк кода никто не станет — для повторения действий есть циклы.
Цикл for
for i in range(5):
print("Шаг", i)
Вывод:
Шаг 0
Шаг 1
Шаг 2
Шаг 3
Шаг 4
Как это работает: переменная i по очереди принимает каждое значение из range(5), и для каждого значения выполняется тело цикла — строки с отступом под for. Одно выполнение тела называется итерацией.
range — последовательность чисел
| Запись | Числа |
|---|---|
range(5) |
0, 1, 2, 3, 4 |
range(2, 6) |
2, 3, 4, 5 |
range(1, 10, 3) |
1, 4, 7 |
range(5, 0, -1) |
5, 4, 3, 2, 1 |
Главное правило: правая граница не входит. range(a, b) идёт от a до b - 1. Хочешь включить b — пиши range(a, b + 1).
Третий параметр — шаг. Отрицательный шаг идёт вниз.
Накопление: сумма
Чтобы что-то посчитать в цикле, заводят переменную до цикла и меняют её внутри:
total = 0
for x in range(1, 6):
total = total + x
print(total) # 15 = 1 + 2 + 3 + 4 + 5
Запись total = total + x можно сократить: total += x. Так же работают -=, *=, //=.
Пример: произведение чисел от 1 до 5 (факториал):
p = 1 # для произведения начинаем с 1, а не с 0!
for x in range(1, 6):
p *= x
print(p) # 120
Счётчик
Сколько чисел от 1 до 100 делятся на 7?
count = 0
for x in range(1, 101):
if x % 7 == 0:
count += 1
print(count) # 14
Внутри цикла можно использовать всё, что ты уже знаешь: условия, арифметику, print.
Чтение n чисел
Типичный формат входа: в первой строке n, а потом n строк по одному числу. Цикл как раз нужен, чтобы прочитать их все:
n = int(input())
total = 0
for _ in range(n):
x = int(input())
total += x
print(total)
Если переменная цикла не нужна, её часто называют _.
Каждый input() внутри цикла читает следующую строку — за n итераций мы прочитаем ровно n чисел.
Минимум и максимум «вручную»
Как найти наименьшее из чисел, которые приходят по одному? Храним «лучшее на данный момент» и сравниваем с каждым новым:
n = int(input())
smallest = int(input()) # первое число — пока самое маленькое
for _ in range(n - 1):
x = int(input())
if x < smallest:
smallest = x
print(smallest)
Обрати внимание, чем мы начали: первым числом из входа, а не каким-то «удобным» значением вроде 0. Подумай, что пошло бы не так, если бы все числа были больше нуля, а мы начали с smallest = 0.
Печать в одну строку
По умолчанию print переходит на новую строку. Чтобы печатать в цикле через пробел, используй end:
for i in range(1, 6):
print(i * 10, end=" ")
print() # в конце перейти на новую строку
Вывод: 10 20 30 40 50 . Лишний пробел в конце обычно не мешает, если в задаче сравниваются числа, а не текст целиком.
Сколько это займёт
Простая операция в цикле выполняется быстро, но не мгновенно. Цикл на 105–106 итераций укладывается в секунду, а на 109 — уже нет. Смотри на ограничения в условии: они подсказывают, какое решение успеет.
Итог
for i in range(...)повторяет тело цикла для каждого значения;range(a, b)не включаетb; третий параметр — шаг;- накопители (сумма, счётчик, произведение) заводятся до цикла;
- для чтения
nчисел вызывайinput()в цикле; - для минимума и максимума начинай с первого прочитанного значения.