Открыть сервисСервис

Функция 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 и делением).

Источники:

Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru