Функция range()
Функция range()
В предыдущем уроке вы видели range() в паре с for, но не разбирали её детально. Пришло время: range() — одна из самых используемых встроенных функций Python, и знать её тонкости необходимо.
Что такое range()
range() создаёт объект-диапазон — последовательность целых чисел. Это не список чисел в памяти (что было бы расточительно для range(1_000_000)), а «ленивая» последовательность, которая генерирует числа по требованию.
Три формы вызова:
range(stop) # от 0 до stop (не включая)
range(start, stop) # от start до stop (не включая)
range(start, stop, step) # от start до stop с шагом step
range(stop)
Создаёт числа от 0 до stop - 1:
for i in range(5):
print(i) # 0 1 2 3 4
# Преобразование в список для наглядности:
print(list(range(5))) # [0, 1, 2, 3, 4]
print(list(range(1))) # [0]
print(list(range(0))) # [] — пустой диапазон
Ноль в качестве stop даёт пустой диапазон. Отрицательный stop тоже:
print(list(range(-3))) # [] — пустой
range(start, stop)
Создаёт числа от start до stop - 1:
print(list(range(1, 6))) # [1, 2, 3, 4, 5]
print(list(range(3, 8))) # [3, 4, 5, 6, 7]
print(list(range(5, 5))) # [] — start == stop → пусто
print(list(range(10, 3))) # [] — start > stop → пусто (при шаге 1)
Типичное использование — числа от 1 до N включительно:
n = 10
for i in range(1, n + 1): # range(1, 11) → 1..10
print(i)
range(start, stop, step)
Добавляет шаг — расстояние между соседними числами:
print(list(range(0, 10, 2))) # [0, 2, 4, 6, 8] — чётные
print(list(range(1, 10, 2))) # [1, 3, 5, 7, 9] — нечётные
print(list(range(0, 100, 10))) # [0, 10, 20, ..., 90]
Шаг может быть отрицательным — для обратного отсчёта. При отрицательном шаге start должен быть больше stop:
print(list(range(10, 0, -1))) # [10, 9, 8, ..., 1]
print(list(range(5, -1, -1))) # [5, 4, 3, 2, 1, 0]
print(list(range(100, 0, -10))) # [100, 90, ..., 10]
Типичные паттерны с range
N повторений:
for _ in range(3):
print("tick") # выводит 3 раза
Числа от 1 до N:
total = 0
for i in range(1, 101): # 1..100
total += i
print(total) # 5050
Обратный отсчёт:
for i in range(5, 0, -1):
print(i) # 5 4 3 2 1
print("Пуск!")
Чётные числа:
for n in range(2, 11, 2):
print(n) # 2 4 6 8 10
Индексы строки или списка:
word = "Python"
for i in range(len(word)): # 0, 1, 2, 3, 4, 5
print(f"word[{i}] = {word[i]}")
range vs список чисел
Важное преимущество range — эффективность памяти. Объект range(1_000_000) занимает примерно столько же памяти, сколько range(5) — несколько байт для хранения параметров. Список из миллиона чисел занимал бы мегабайты.
import sys
print(sys.getsizeof(range(1_000_000))) # ~ 48 байт
print(sys.getsizeof(list(range(1000)))) # ~ 8856 байт
Поэтому for i in range(N) всегда предпочтительнее for i in list(range(N)).
Преобразование range в список
Иногда нужен настоящий список чисел — например, чтобы его модифицировать. Тогда явно конвертируем:
numbers = list(range(1, 6))
print(numbers) # [1, 2, 3, 4, 5]
Проверь себя
Что выведет этот код?
for i in range(10, 0, -3):
print(i)
Начало 10, конец 0 (не включая), шаг -3. Последовательность: 10 → 7 → 4 → 1 → -2 (стоп, < 0 уже). Вывод: 10, 7, 4, 1.
Проверьте в интерпретаторе!
Итог
range(stop)→ числа0, 1, ..., stop-1.range(start, stop)→ числаstart, start+1, ..., stop-1.range(start, stop, step)→ числа с шагом; шаг может быть отрицательным.range— «ленивая» последовательность: не хранит все числа в памяти.- Для конвертации в список:
list(range(...)). - Типичные паттерны: N повторений (
range(N)), числа 1..N (range(1, N+1)), обратный отсчёт (range(N, 0, -1)).
В следующем уроке изучим операторы break, continue и pass — инструменты для управления ходом цикла изнутри.