Глава 10 · Немного автоматизации!

range() подробно

range() — не список, а генератор чисел по требованию. Разбираем все три его формы и то, откуда взялось правило «stop не включён».

range() — не список

range() — одна из самых частых причин путаницы у новичков. Разберёмся сразу и точно.

range() НЕ создаёт список
range(5) создаёт особый объект-генератор чисел — он выдаёт числа по одному, по требованию, а не хранит их все сразу в памяти как список. list(range(5)) действительно даст [0, 1, 2, 3, 4] — но это отдельное, явное превращение, а не то, чем является сам range.

Три уровня сигнатуры

ВызовЧто означаетПример
range(stop)от 0 до stop, не включая stoprange(5) → 0, 1, 2, 3, 4
range(start, stop)от start до stop, не включая stoprange(2, 8) → 2, 3, 4, 5, 6, 7
range(start, stop, step)от start до stop с шагом step, не включая stoprange(0, 10, 2) → 0, 2, 4, 6, 8
012345stop — исключён
range(5) — пять значений: 0, 1, 2, 3, 4; сам stop=5 в результат не входит
2345678stop — исключён
range(2, 8) — от 2 до 7 включительно; 8 не входит

Почему stop не включается

Это не произвольная прихоть языка — это то же самое правило, что мы уже видели в главе 8 у срезов строк. "Python"[0:3] берёт символы с индексами 0, 1, 2 — и не включает символ с индексом 3. range(0, 3) устроен ровно так же: 0, 1, 2, без 3. Python последователен: «конец диапазона» везде означает «до этого места, не включая его».

Полезное следствие
Благодаря этому правилу range(n) всегда даёт ровно n чисел, а длина среза s[a:b] всегда равна b - a — считать количество элементов получается без дополнительных +1/-1 в уме.

Шаг: step

Третий аргумент задаёт, на сколько увеличивается (или уменьшается) число на каждом шаге:

shag.py
for number in range(0, 10, 2):
    print(number)
0+22+24+26+2810stop — исключён
range(0, 10, 2) — шаг 2: 0, 2, 4, 6, 8

Отрицательный шаг

Шаг может быть отрицательным — тогда числа идут в обратную сторону, но start и stop нужно тоже поменять местами по смыслу: start должен быть больше, чем stop.

otricatelnyj_shag.py
for number in range(10, 0, -2):
    print(number)
10-28-26-24-220stop — исключён
range(10, 0, -2) — отсчёт назад с шагом 2: 10, 8, 6, 4, 2
Отрицательный range без отрицательного шага — пустой
range(10, 0) (без шага) не выдаст ничего — шаг по умолчанию равен +1, а с ним никогда не попасть от 10 вниз к 0. Чтобы диапазон шёл вниз, шаг обязательно должен быть отрицательным и соответствовать направлению.
Шаг 0 — ошибка, а не бесконечный цикл
range(0, 10, 0) не зависает и не превращается в бесконечный цикл — Python сразу поднимает ValueError: range() arg 3 must not be zero, потому что с нулевым шагом никогда не сдвинуться от start к stop.
Практика: range() — старт, стоп, шаг
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →