Что такое range() в Python?

Range — это встроенная функция (built-in function) языка программирования Python, которая возвращает специальный объект — range object, представляющий собой неизменяемую (immutable) последовательность чисел. Этот объект не хранит все числа в памяти одновременно, а генерирует их «на лету» по мере необходимости, что делает его очень эффективным при работе с большими диапазонами.

Основное предназначение range() — создание последовательности целых чисел для итерации в циклах, прежде всего в цикле for.

Синтаксис и параметры функции range()

Функция range() может принимать от одного до трёх аргументов:

1. range(stop)

Создаёт последовательность чисел от 0 до stop - 1 с шагом 1.

Пример:

for i in range(5):
    print(i)
# Вывод: 0, 1, 2, 3, 4

2. range(start, stop)

Создаёт последовательность чисел от start до stop - 1 с шагом 1.

Пример:

for i in range(2, 7):
    print(i)
# Вывод: 2, 3, 4, 5, 6

3. range(start, stop, step)

Создаёт последовательность чисел от start до stop - 1 с заданным шагом step. Шаг может быть как положительным, так и отрицательным.

Примеры:

# С положительным шагом
for i in range(0, 10, 2):
    print(i)
# Вывод: 0, 2, 4, 6, 8

# С отрицательным шагом (обратный порядок)
for i in range(5, 0, -1):
    print(i)
# Вывод: 5, 4, 3, 2, 1

Основные особенности и поведение

  • «Ленивые» вычисления: range() не создаёт список сразу. Она возвращает объект-генератор, который выдаёт следующее число только когда это требуется. Это экономит память.
  • Индексация и срезы: К объекту range можно применять индексацию, как к списку: r = range(10); print(r[5]) # 5. Также поддерживаются срезы, которые возвращают новый объект range.
  • Неизменяемость: Последовательность, создаваемая range(), неизменяема. Нельзя изменить её элементы по индексу.
  • Проверка вхождения: С помощью оператора in можно проверить, входит ли число в последовательность: 5 in range(10) # True.

Практическое применение range()

Использование в цикле for

Это классический и самый частый сценарий:

# Повторить действие 3 раза
for _ in range(3):
    print("Привет, мир!")

# Перебор индексов списка
fruits = ['яблоко', 'банан', 'вишня']
for i in range(len(fruits)):
    print(f"Индекс {i}: {fruits[i]}")

Создание списков (list) и кортежей (tuple)

Хотя range сам по себе не является списком, его легко преобразовать:

# Создание списка чисел
numbers_list = list(range(1, 6))  # [1, 2, 3, 4, 5]

# Создание кортежа
numbers_tuple = tuple(range(0, 10, 2))  # (0, 2, 4, 6, 8)

Итерация в обратном порядке

Используя отрицательный шаг, можно легко организовать обратный перебор:

for i in range(10, 0, -1):
    print(f"Обратный отсчёт: {i}")
print("Старт!")

Отличие range() от xrange() (Python 2) и аналоги в Python 3

В Python 2 существовали две функции: range(), которая возвращала список, и xrange(), которая возвращала генератор. В Python 3 функция range() ведёт себя как xrange() из Python 2 (ленивый генератор), а старая реализация range() (создающая список) была удалена. Функция xrange() в Python 3 отсутствует.

Распространённые ошибки и подводные камни

  1. Пустой диапазон: Если start >= stop при положительном шаге (или start <= stop при отрицательном), range создаст пустую последовательность. Цикл не выполнится ни разу.
    for i in range(5, 2):  # start > stop при step=1
        print(i)  # Этот код никогда не выполнится
  2. Шаг, равный нулю: Вызов range(1, 5, 0) вызовет ошибку ValueError, так как шаг не может быть равен нулю.
  3. Дробные числа: Функция range() работает только с целыми числами (тип int). Для последовательностей дробных чисел используйте numpy.arange() или генерацию списка с помощью цикла.

Заключение

Range — это фундаментальный и оптимизированный инструмент Python для работы с последовательностями целых чисел. Его понимание критически важно для написания эффективных и читаемых циклов. Запомните простое правило: range(start, stop, step) генерирует числа от start включительно до stop исключительно с заданным шагом. Использование range() вместо создания списков вручную — это хорошая практика, которая помогает экономить ресурсы памяти, особенно при работе с большими данными.

Источники