- Функция range в Python
- Синтаксис
- for i in range
- Операции с range
- range и тип float
- Отличия между range в python2 и python3
- Best Practices
- range в обратном порядке (python reverse range)
- range включительно
- range до бесконечности
- range → в список (list) или множество (set)
- Функция range в Python
- Что такое диапазон?
- Функция range
- Вывод в обратном порядке
- Различия между range и xrange
- Заключение
Функция range в Python
Range — это встроенная функция Python, которая возвращает итерируемый объект ( range object ), содержащий целые числа. С помощью функция range() можно сгенерировать последовательность чисел с определенным шагом — далее их можно легко перебирать с помощью цикла for .
В статье подробно рассказываю, как работает range() , чем отличается её реализация в Python 2 и Python 3, а также приведу практические примеры использования.
Синтаксис
Функцию range() можно использовать с одним или несколькими параметрами. В документации Python синтаксис выглядит следующим образом:
class range(stop) # с одним параметров class range(start, stop[, step]) # с несколькими параметрами
- start — начало последовательности [включительно] (не обязательный параметр, по умолчанию равен 0).
- stop — задает точку остановки последовательности [значение не включено в последовательность] (обязательный параметр).
- step — шаг последовательности (не обязательный параметр, по умолчанию равен 1).
Функция range() возвращает объект класса 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 #») > 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) >>> numbers_list [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] >>> numbers_set = set(numbers) >>> type(numbers_set) >>> numbers_set
range и тип float
По умолчанию функция range() позволяет использовать только целые числа в качестве параметров. Если вы передадите значение с плавающей точкой, то Python вызовет исключение TypeError :
numbers = range(1.5) print(numbers) > Traceback (most recent call last): File «test.py», line 1, in 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, то можно написать собственную функцию, например так:
Отличия между 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 -> «) time.sleep(1) > iter -> 0 > iter -> 1 > iter -> 2 > .
Или через бесконечный цикл while :
import time i = 0 while True: print(f»iter -> «) 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]
natural_num_set = set(range(1, 11)) # множество натуральных чисел от 1 до 10 print(natural_num_set) >
Функция range() генерирует последовательность целых чисел и обычно используется для организации перебора в циклах for . При этом аргументами могут быть только целые числа, использование типов float, string и других недопустимо. Передаваемые значения могут быть как положительные, так и отрицательные, но step не может быть равен нулю.
Функция range в Python
Тип range (диапазон) является встроенной разновидностью данных в языке Python, которая предназначена для хранения информации об арифметической прогрессии целых чисел. Для ее генерации используется одноименная функция range с тремя различными параметрами. Диапазон обеспечивает комфортную работу с коллекциями при их циклической обработке.
Что такое диапазон?
Диапазон представляет собой неизменяемую последовательность целых чисел, которая чаще всего применяется для генерации более сложных наборов данных при помощи генераторов. Но в отличие от списков, кортежей, а также других стандартных коллекций, для обработки такого объекта всегда требуется одинаково малое количество памяти. Благодаря особому подходу к хранению данных, в память записываются не все элементы последовательности, а только ее длина, шаг и стартовая точка. Остальные данные вычисляются по мере необходимости.
Функция range
Для генерации диапазона нужно вызвать функцию range, передав ей от 1 до 3 целочисленных аргументов. В языке Python диапазон является самостоятельным объектом. Поэтому создать его можно с помощью присвоения результата работы range определенному идентификатору. Проверить, к какому классу принадлежит такой объект, можно с помощью метода type().
Рассмотрим описание функции range в Python 3. Как уже было сказано, она принимает несколько параметров:
Все указывать необязательно, так как start и step по умолчанию имеют значения 0 и 1 соответственно. Однако самостоятельно задать stop для диапазона все же необходимо.
Если задать только один аргумент, то задастся конец диапазона (stop). Если задается аргументов больше одного, то порядок будет следующим: start, stop, step.
Следующий пример демонстрирует результат работы функции range.
data = range(10) print(data) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Таким образом, получилась последовательность с 10 целыми элементами, так как значения параметров start и step оставались по умолчанию. Попробуем добавить один аргумент.
data = range(3, 10) print(data) [3, 4, 5, 6, 7, 8, 9]
Как видно из результатов выполнения программы, первый параметр функции range задает стартовое значение для будущей последовательности (3), в то время как второй отображает ее конечную границу (10). Однако, вопреки ожиданиям, число 10 не включается в итоговую последовательность. Добавим третий аргумент в функцию и посмотрим, что будет.
data = range(3, 10, 2) print(data) [3, 5, 7, 9]
В данном случае задается диапазон чисел в Python 3 используя максимально возможное количество параметров, которые отвечают за начало (3), конец (10) и шаг (2). Таким образом, функция print вывела 4 целочисленных значения с одинаковым интервалом последовательности. Стоит всегда учитывать порядок расположения ее аргументов: start, stop и step. Все они могут обладать лишь целочисленным значением, как положительным, так и отрицательным.
Очень часто диапазоны используются для быстрой генерации списка либо другой коллекции чисел. Чтобы сделать это, необходимо всего лишь передать результат выполнения в качестве параметра для list. Следующий пример демонстрирует создание списка.
data = list(range(10, -25, -5)) print(data) [10, 5, 0, -5, -10, -15, -20]
Вывод в обратном порядке
Благодаря реализации интерфейса collections.abc.Sequence ABC, объекты класса range можно обрабатывать различными способами, как списки или кортежи. Таким образом, диапазоны обладают возможностью проверки вхождения, поиска по индексу, среза или отрицательной индексации. В следующем примере показывается вывод списка в Python 3 c range в обратном порядке.
data = list(reversed(range(10, -35, -10))) print(data) [-30, -20, -10, 0, 10]
Для этого используется встроенная функция reversed, обрабатывающая последовательность некоторых данных и возвращающая каждый из ее элементов в противоположном порядке.
Различия между range и xrange
Иногда при работе со старым кодом, написанным во времена Python 2, можно повстречать метод под названием xrange. Он очень похож на стандартный range. Единственным отличием xrange от range является то, что при вызове первого создается новый объект типа range, а не обычный список класса list. В таком случае элементы последовательности не хранятся в памяти, а генерируются по ходу выполнения программы для экономии ресурсов.
Скорее всего, это было сделано для улучшения эффективности работы с большими последовательностями чисел. К примеру, в старых версиях языка использование функции range со значением, выше чем sys.maxsize, приводило к ошибке и завершению программы.
Заключение
Таким образом, тип range (диапазон) имеет массу путей применения, поскольку позволяет легко автоматизировать процесс заполнения различных наборов чисел. Как правило, для этой цели применяется функция range, в которой указан начальный элемент, граница и шаг последовательности. Благодаря реализации интерфейса коллекции, диапазоны обеспечивают проверку вхождения, поиск по индексу, срез и отрицательную индексацию элементов.