Функция range в Python¶
range() — встроенная функция языка программирования Python, возвращающая неизменяемую последовательность арифметической прогрессии (объект типа range). Широко применяется для организации циклов for, генерации числовых последовательностей и индексирования. Функция не создаёт список в памяти целиком, а вычисляет значения по требованию, что делает её эффективной для больших диапазонов.
¶Сигнатура и параметры
Функция поддерживает три формы вызова:
``python range(stop) range(start, stop) range(start, stop, step) ``
| Параметр | Описание | По умолчанию |
|---|---|---|
start | Начальное значение (включительно) | 0 |
stop | Конечное значение (НЕ включается) | — (обязателен) |
step | Шаг прогрессии | 1 |
Если указан только один аргумент, он трактуется как stop, а start принимает значение 0.
¶Базовое использование
``python for i in range(5): print(i) # 0, 1, 2, 3, 4 ``
Обратите внимание, что значение stop не включается в последовательность: range(5) порождает пять элементов — от 0 до 4 включительно.
```python for i in range(2, 7): print(i) # 2, 3, 4, 5, 6
for i in range(1, 10, 2): print(i) # 1, 3, 5, 7, 9 ```
¶Отрицательный шаг
Если step отрицателен, start должен быть больше stop, иначе последовательность будет пустой:
```python for i in range(10, 0, -1): print(i) # 10, 9, 8, ..., 1
list(range(5, 0, -1)) # [5, 4, 3, 2, 1] list(range(0, 5, -1)) # [] — пустой диапазон ```
¶Преобразование в другие типы
Сам объект range — не список, но его легко преобразовать:
``python list(range(5)) # [0, 1, 2, 3, 4] tuple(range(3)) # (0, 1, 2) set(range(3)) # {0, 1, 2} ``
При этом сам объект range поддерживает большинство операций последовательностей: проверку принадлежности (in), вычисление длины (len()), индексацию и срезы:
``python r = range(10) 5 in r # True len(r) # 10 r[2] # 2 r[1:5] # range(1, 5) ``
¶Экономия памяти
Ключевое преимущество range перед списком — отсутствие хранения всех элементов одновременно. Для range(10_000_000) объект занимает фиксированный объём памяти (три целых числа: start, stop, step), тогда как эквивалентный список занял бы сотни мегабайт. Значения вычисляются лениво — по мере итерации.
¶Тип range
Объект range относится к неизменяемым последовательностям (immutable sequence). Его нельзя изменить после создания, но можно получить новый объект через срез:
``python r = range(0, 100, 2) r2 = r[10:20] # range(20, 40, 2) ``
Срез сохраняет шаг исходного объекта.
¶Итерация по индексам
Частый паттерн — использование range с len() для доступа к элементам по индексу:
``python fruits = ['яблоко', 'груша', 'слива'] for i in range(len(fruits)): print(i, fruits[i]) ``
В Python 3 рекомендуется использовать enumerate() вместо такого подхода:
``python for i, fruit in enumerate(fruits): print(i, fruit) ``
¶Обратный отсчёт и декремент
``python for i in range(10, 0, -1): print(i) ``
Такой приём часто используется для обратного отсчёта или обхода массива с конца.
¶Особенности Python 2
В Python 2 существовала функция xrange(), возвращавшая генератороподобный объект, и range(), создававшая полный список. В Python 3 xrange() удалена, а range() получила поведение бывшей xrange(). Для совместимости со старым кодом иногда используется конструкция try: range = xrange except NameError: pass.
¶Частые ошибки
- Ожидание включения
stopв последовательность:range(1, 5)даёт 1, 2, 3, 4 — без 5. - Использование нулевого шага приводит к
ValueError: range() arg 3 must not be zero. - Попытка изменить объект
rangeприводит кTypeError.
¶Применение
- Организация циклов с известным числом итераций.
- Генерация последовательностей для тестов и математических вычислений.
- Индексирование и обход элементов списка.
- Создание равномерно распределённых точек (в связке с
floatи делением).
Источники:
- Документация Python: https://docs.python.org/3/library/functions.html#range
- «Python. Подробное руководство», Марк Лутц
- «Python Cookbook», Дэвид Бизли, Мартин Фаулз
