Функция range в Python
Range — это встроенная функция Python, которая возвращает итерируемый объект (range object
), содержащий целые числа. С помощью функция range()
можно сгенерировать последовательность чисел с определенным шагом — далее их можно легко перебирать с помощью цикла for
.
В статье подробно рассказываю, как работает range()
, чем отличается её реализация в Python 2 и Python 3, а также приведу практические примеры использования.
Синтаксис
Функцию range()
можно использовать с одним или несколькими параметрами. В документации Python синтаксис выглядит следующим образом:
class range(stop) # с одним параметров
class range(start, stop[, step]) # с несколькими параметрами
У функции 3 параметра:
start
— начало последовательности [включительно] (не обязательный параметр, по умолчанию равен 0).stop
— задает точку остановки последовательности [значение не включено в последовательность] (обязательный параметр).step
— шаг последовательности (не обязательный параметр, по умолчанию равен 1).
Функция range()
возвращает объект класса range
:
print(type(range(3)))
> <class 'range'>
💁♂️ Примеры:
# от 0 до stop (не включая значение stop)
for i in range(7):
print(i, end=' ')
> 0 1 2 3 4 5 6
# от start до stop
for i in range(4, 11):
print(i, end=' ')
> 4 5 6 7 8 9 10
# от start до stop с шагом step
for i in range(4, 11, 2):
print(i, end=' ')
> 4 6 8 10
# последовательность в обратном порядке (не включая значение stop)
for i in range(10, 0, -1):
print(i, end=' ')
> 10 9 8 7 6 5 4 3 2 1
☝️ При работе с range()
важно помнить следующее:
- Значение
stop
не входит в последовательность; - Все аргументы функции должны быть целыми числами (положительными или отрицательными);
- При отрицательном шаге
step
нужно помнить, что значениеstart
должно быть больше значенияstop
; - Значение
step
не должно быть равно 0, иначе Python вызовет исключение "ValueError
".
📃 Более подробное описание функции можно посмотреть в официальной документации или через help("range")
:
class range(object)
| range(stop) -> range object
| range(start, stop[, step]) -> range object
|
| Return an object that produces a sequence of integers from start (inclusive)
| to stop (exclusive) by step. range(i, j) produces i, i+1, i+2, ..., j-1.
| start defaults to 0, and stop is omitted! range(4) produces 0, 1, 2, 3.
| These are exactly the valid indices for a list of 4 elements.
| When step is given, it specifies the increment (or decrement).
| ...
for i in range
Чаще всего range()
используется в циклах for.
Основной кейс — выполнение цикла N-раз:
for i in range(3):
print(f"iteration #{i + 1}")
> iteration #1
> iteration #2
> iteration #3
С помощью range()
можно перебрать все значения в последовательности:
str = 'abcdef'
for i in range(len(str)):
print(str[i], end=' ')
> a b c d e f
Или найти сумму первых 10-ти целых чисел.
s = 0
for i in range(11): # от 0 до 9 (11 не входит в последовательность)
s += i
print(s)
> 55
А так можно перебрать значения последовательности через одного:
s = 'a1b2c3d4e5f6g7h8'
for i in range(0, len(s), 2):
print(s[i], end=' ')
> a b c d e f g h
С помощью функции range()
можно организовать сдвиг букв в слове на одну позицию и получить все возможные варианты такого сдвига:
s = 'питон'
for i in range(len(s)):
s = s[1:] + s[:1]
print(s, end=' ')
> итонп тонпи онпит нпито питон
Или получить все числа из заданного диапазона, делящиеся на любое нужное. Например, напечатаем таблицу умножения на 8:
count = 1
for i in range(8, 80, 8):
print(count, ' * 8 = ', i)
count += 1
> 1 * 8 = 8
> 2 * 8 = 16
> 3 * 8 = 24
> 4 * 8 = 32
> 5 * 8 = 40
> 6 * 8 = 48
> 7 * 8 = 56
> 8 * 8 = 64
> 9 * 8 = 72
Операции с range
Объект range
поддерживает все операции, доступные последовательностям (кроме сложения и умножения):
>>> numbers = range(13)
>>> numbers[3] # обращение к конкретному элементу
3
>>> 3 in numbers # проверка на вхождение в диапазон
True
>>> numbers[:4] # срез диапазона
range(0, 4)
>>> len(numbers) # длина диапазона
13
>>> min(numbers) # минимальный элемент диапазона
0
>>> max(numbers) # максимальный элемент диапазона
12
>>> numbers = range(0, 13, 2)
>>> numbers.index(6) # индекс (позиция) числа в диапазоне
3
Также объект range можно привести к списку (list
) или множеству (set
):
>>> numbers = range(13)
>>> numbers_list = list(numbers)
>>> type(numbers_list)
<class 'list'>
>>> numbers_list
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> numbers_set = set(numbers)
>>> type(numbers_set)
<class 'set'>
>>> numbers_set
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
range и тип float
По умолчанию функция range()
позволяет использовать только целые числа в качестве параметров. Если вы передадите значение с плавающей точкой, то Python вызовет исключение TypeError
:
numbers = range(1.5)
print(numbers)
> Traceback (most recent call last):
File "test.py", line 1, in <module>
numbers = range(1.5)
TypeError: 'float' object cannot be interpreted as an integer
Чтобы сгенерировать последовательность из чисел с плавающей точкой, можно использовать стороннюю библиотеку NymPy
(её нужно предварительно установить). В ней есть функция arange()
, похожая на стандартную range()
:
import numpy as np
float_numbers = np.arange(4.6, 5.8, 0.3)
print(float_numbers)
> [4.6 4.9 5.2 5.5 5.8]
Если вы не хотите устанавливать библиотеку NymPy, то можно написать собственную функцию, например так:
def f_range(start, stop, step):
while start < stop:
yield round(float(start), 1)
start += step
print(list(f_range(4.6, 5.8, 0.3)))
> [4.6, 4.9, 5.2, 5.5, 5.8]
Отличия между range в python2 и python3
Range()
в Python2 и Python3 — это разные функции, которые отличаются друг от друга.
В Python2 функция range()
возвращает объект list
, то есть она выдает все числа сразу и помещает их в оперативную память. Поэтому, при генерации длинных последовательностей, увеличивается расход памяти и время работы.
Функция xrange()
в Python2 и range()
в Python3 не генерируют всю последовательность чисел сразу, а выдают нужные значения по мере необходимости, при переходе к следующей итерации цикла.
Таким образом, xrange()
используемая в Python2 и range()
в Python3 являются аналогами.
Best Practices
range в обратном порядке (python reverse range)
Получить последовательность в обратном порядке можно с помощью отрицательного аргумента step
:
reversed_range = range(5, 0, -1) # start = 5, stop = 0, step = -1
for i in reversed_range:
print(i, end=' ')
> 5 4 3 2 1
Обратите внимание, что start
> stop
, и stop
не входит в последовательность.
range включительно
По умолчанию, значение из переменной stop
не входит в последовательность. Чтобы это исправить, к stop
прибавьте step
:
step = 2
numbers = range(2, 10 + step, step)
for i in numbers:
print(i, end=' ')
> 2 4 6 8 10
range до бесконечности
Так как у функции range()
есть обязательный параметр stop
, бесконечный цикл сделать не получится.
Но это можно сделать через itertools
:
import itertools
import time
for i in itertools.count():
print(f"iter -> {i}")
time.sleep(1)
> iter -> 0
> iter -> 1
> iter -> 2
> ...
Или через бесконечный цикл while
:
import time
i = 0
while True:
print(f"iter -> {i}")
i += 1
time.sleep(1)
> iter -> 0
> iter -> 1
> iter -> 2
> ...
range → в список (list) или множество (set)
С помощью range
можно сгенерировать список (list
):
num_set = list(range(1, 11, 2)) # список целых чисел
print(num_set)
> [1, 3, 5, 7, 9]
Или сгенерировать множество (set
):
natural_num_set = set(range(1, 11)) # множество натуральных чисел от 1 до 10
print(natural_num_set)
> {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
Функция range()
генерирует последовательность целых чисел и обычно используется для организации перебора в циклах for
. При этом аргументами могут быть только целые числа, использование типов float, string и других недопустимо. Передаваемые значения могут быть как положительные, так и отрицательные, но step
не может быть равен нулю.
Спасибо большое за информацию, много чего полезного узнал.
range
с шагом 0.1 можно еще заранее сгенерировать:float_numbers = (x / 10.0 for x in range(0, 100)) for i in float_numbers: print(i)