range(stop) range(start, stop) range(start, stop, step)
start
- int
, начало последовательности,stop
- int
, конец последовательности,step
- int
, шаг последовательности.int
, последовательность целых чисел, с заданным шагом.Класс range()
(диапазон) генерирует арифметическую прогрессию целых чисел, с заданным шагом. По существу это отдельный неизменяемый тип данных в языке Python. Диапазоны реализуют все общие операции с последовательностями, кроме конкатенации и повторения, поскольку объекты диапазона могут представлять только последовательности, которые следуют строгому шаблону, а повторение и конкатенация обычно нарушают этот шаблон.
Последовательности реализуют интерфейс ABC collections.abc.Sequence
, и предоставляют такие возможности как проверка вхождения if num in range
, обращение к элементу по индексу range[i]
, поиск индекса элемента, взятие среза и отрицательную индексацию.
Аргументы конструктора класса range()
должны быть целыми числами, или любым объектом, который реализует специальный метод __index__
. Если аргумент шага step
опущен, по умолчанию используется значение step=1
. Если аргумент start
пропущен, то по умолчанию используется значение start=0
. Если шаг равен нулю step=1
, бросается исключение ValueError
.
range()
определяется по формуле r[i] = start + step*i
, где i >= 0
и r[i] < stop
range()
так же определяется по формуле r[i] = start + step*i
, но есть ограничения i >= 0
и r[i] > stop
.Объект range()
будет пустым, если r[0]
не соответствует ограничению значения. Диапазоны поддерживают отрицательные индексы, но они интерпретируются как индексация с конца последовательности, которая определена положительными индексами.
Диапазоны, содержащие абсолютные значения, превышающие допустимые sys.maxsize
будут работать, но некоторые функции, например len()
, могут вызывать OverflowError
.
Проверка range()
на равенство при помощи ==
и !=
сравнивает их как последовательности. Это означает, что два диапазона равны, если они представляют одинаковую последовательность значений. Обратите внимание, что два равных диапазона могут иметь разные start
, stop
и step
. Например: range(0) == range(2, 1, 3)
или range(0, 3, 2) == range(0, 4, 2)
.
Преимущество типа данных range
над списками list
или кортежами tuple
в том, что диапазоны range
всегда будут занимать небольшое количество памяти, независимо от размера диапазона, которое он представляет, так как он хранит в памяти только значение start
, stop
и step
, а элементы последовательности вычисляется по мере необходимости.
# Общие примеры >>> list(range(10)) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> list(range(1, 11)) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> list(range(0, 30, 5)) [0, 5, 10, 15, 20, 25] >>> list(range(0, 10, 3)) [0, 3, 6, 9] >>> list(range(0, -10, -1)) [0, -1, -2, -3, -4, -5, -6, -7, -8, -9] >>> list(range(0)) [] >>> list(range(1, 0)) []
range()
.>>> r = range(0, 20, 2) # Проверка вхождения >>> 11 in r False >>> 10 in r True # Поиск индекса элемента >>> r.index(10) 5 # Обращение к элементу по его индексу >>> r[5] 10 # Срез диапазона >>> r[:5] range(0, 10, 2) >>> r[-1] 18
range()
в цикле for/in
.# отсчет с нуля >>> for i in range(0, 5): ... print(i) ... # 0 # 1 # 2 # 3 # 4 # отсчет с единицы >>> for i in range(1, 6): ... print(i) ... # 1 # 2 # 3 # 4 # 5 # использование шага в циклах >>> for n, i in enumerate(range(0, 7, 2), 1): ... print(f'{n}) => {i}') ... # 1) => 0 # 2) => 2 # 3) => 4 # 4) => 6 # обратный отсчет с шагом в циклах # при помощи класса `range()` >>> for n, i in enumerate(range(-7, 0, 2), 1): ... print(f'{n}) => {abs(i)}') ... # 1) => 7 # 2) => 5 # 3) => 3 # 4) => 1