</>
Тема 5 из 18

Цикл for и range

selfedu · Видео необязательно — всё нужное есть в тексте ниже.Открыть на YouTube ↗

Представь, что нужно напечатать числа от 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() в цикле;
  • для минимума и максимума начинай с первого прочитанного значения.