Функция range() в Python
Тип range Python генерирует последовательность целых чисел, определяя начальную и конечную точки диапазона. Обычно он используется с циклом for для перебора последовательности чисел.
range() работает по-разному в Python 2 и 3.
В этой статье мы рассмотрим основу Python 3 range типа.
Синтаксис range() в Python
Конструктор range принимает следующие формы:
Аргументы, передаваемые конструктору range должны быть целыми числами. Плавающие числа и другие типы не допускаются.
range принимает один обязательный и два необязательных аргумента. Он возвращает объект диапазона, который представляет данный диапазон и генерирует числа по запросу.
range(stop)
Вот тип диапазона в действии:
Сгенерированная последовательность чисел начинается с 0 и заканчивается 4 (5-1):
Если аргумент равен 0 или range отрицательных целых чисел возвращает пустую последовательность:
Мы конвертируем объект диапазона в список, потому что диапазон выполняет ленивую оценку целочисленной последовательности. Результатом будет пустой список:
range(start, stop)
range(start, stop, step)
Если step положительный, range возвращает последовательность, которая увеличивается:
Если step отрицательный, range возвращает последовательность, которая уменьшается:
Если step равен 0 возникает исключение ValueError:
Выводы
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Python: функция range()
Функция range является одной из встроенных функций, доступных в Python. Он генерирует серию целых чисел, от значения start до stop, указанного пользователем. Мы можем использовать его для цикла for и обходить весь диапазон как список.
Функция range() принимает один обязательный и два необязательных параметра. Это работает по-разному с различными комбинациями аргументов. В этом руководстве мы познакомим вас со всеми возможностями данной функции Python, чтобы вы могли легко использовать ее в своих задачах.
Существует два варианта функции range() в Python 3. Давайте проверим их синтаксис по одному.
Range(Stop)
Это самая основная форма range(). Требуется один аргумент для указания исключительного (Stop) верхнего предела.
«0» становится отправной точкой для генерации чисел. Смотрите пример ниже.
Посмотрите другой пример. Диапазон со стоп-значением «0» генерирует пустой диапазон, то есть нулевые элементы.
Если вы предоставляете нецелочисленное значение остановки, тогда оно вызывает ошибку TypeError.
Range(Start, Stop[, Step])
Это немного сложная форма функции range. Здесь вы можете создать серию чисел с общей разницей по вашему выбору.
Вы можете передать следующие три аргумента:
Обратите внимание на следующие моменты при использовании range() с вышеуказанной подписью.
Обратите внимание, что функция range принимает только целочисленные аргументы. Чтобы создать диапазон с плавающей точкой, следуйте данному руководству: Генерация плавающего диапазона в Python
Функция Python Range() с примерами
Посмотрите примеры кода ниже, чтобы понять эту функцию немного глубже:
Использование параметров Start, Stop и Step
Использование отрицательных значений start, stop и step
Мы можем передавать отрицательные значения для всех параметров диапазона, таких как аргументы start, stop и step.
В приведенном ниже примере мы предоставляем отрицательное значения для stop и step, чтобы выполнить цикл в обратном направлении.
Генерация диапазона как арифметический ряд
Давайте создадим арифметический ряд (i = 10, n = 100, d = 10), используя метод range().
Объект range() работает как генератор. Следовательно, мы преобразовали его в список, чтобы мы могли распечатать значения.
Перебор списка с использованием range()
Мы можем использовать функцию Python range() для обхода списка. Смотрите пример ниже.
Преобразовать диапазон в список
Python 3 range() создает объект типа генератора. По ходу цикла он выбирает значения одно за другим, а не получает их все сразу.
В действительности выходные данные функции range() представляют собой неизменяемую последовательность целых чисел. Следовательно, мы можем преобразовать то же самое в список Python. Мы будем использовать конструктор списка для преобразования вывода диапазона в список.
Смотрите пример ниже.
Верхний предел range включительно
По умолчанию Python range() по умолчанию исключает последнее число. Следовательно, он всегда игнорирует верхний предел своего вывода.
Однако мы можем внести следующие изменения в наш код, чтобы разрешить это.
После внесения вышеуказанных изменений, давайте посмотрим, что происходит:
Range Python против Xrange
Мы изложили несколько отличий и некоторые ключевые факты о функциях range и xrange.
В Python 2.x было две функции диапазона: range() и xrange()
В Python 3.x у нас есть только одна функция range(). Это реализация xrange() из версии 2.x.
Использование индекса с результатом работы range Python
Да, range() возвращает уникальный объект, который обладает свойствами, подобными списку и генератору.
Поскольку он действует как последовательность, мы можем получить доступ к его элементам, используя индексы. Он допускает как положительные так и отрицательные значения индекса.
Объединить вывод двух функций range()
В Python нет встроенной функции для объединения результатов двух результатов range(). Тем не менее, мы все еще можем сделать это.
Существует модуль с именем ‘itertools’, который имеет функцию chain() для объединения двух объектов диапазона.
Смотрите пример ниже.
В заключение
Вот несколько важных фактов о функции Python range():
Функция range в Python
Синтаксис
Функцию range() можно использовать с одним или несколькими параметрами. В документации Pyton синтаксис выглядит следующим образом:
class range(stop) # с одним параметров class range(start, stop[, step]) # с несколькими параметрами
У функции 3 параметра:
Функция range() возвращает объект класса range :
☝️ При работе с range() важно помнить следующее:
? Более подробное описание функции можно посмотреть в официальной документации или через help(«range») :
for i in range
Основной кейс — выполнение цикла 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
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 [4.6, 4.9, 5.2, 5.5, 5.8]
Отличия между range в python2 и python3
Range() в Python2 и Python3 — это разные функции, которые отличаются друг от друга.
Функция xrange() в Python2 и range() в Python3 не генерируют вся последовательность чисел сразу, а выдают нужные значения по мере необходимости, при переходе к следующей итерации цикла.
Таким образом, xrange() используемая в Python2 и range() в Python3 являются аналогами.
Best Practices
range в обратном порядке (python reverse range)
Получить последовательность в обратном порядке можно с помощью отрицательного аргумента step :
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 до бесконечности
Но это можно сделать через itertools :
Или через бесконечный цикл while :
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) >
Функция range() в Python
Встроенная функция Python под названием range может быть очень полезной, если вам нужно выполнить действие определенное количество раз.
К концу данного руководства вы будете:
История range()
Несмотря на то, что range() в Python 2 и range() в Python 3 носят одинаковое название, они кардинально отличаются между собой. Фактически, range() в Python 3 – это просто переименованная версия функции под названием xrange в Python 2.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Telegram Чат & Канал
Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Изначально, range() и xrange() приводили числа, которые можно повторить при помощи цикла for, однако первая функция генерировала список этих чисел, учитывая все за раз, в то время как вторая делала это более лениво, т. е. Числа возвращались по одному каждый раз, когда они нужны.
Наличие огромных списков занимает память, так что нет ничего удивительного в том, что xrange() заменила range(), ее имя и все остальное. Вы можете прочитать больше об этом решении и предыстории xrange() и range() в PEP 3100.
Обратите внимание: PEP означает Python Enhancement Proposal. Это документы, которые покрывают большое количество тем, включая недавно предоставленные новые функции, стили, философию и руководства.
Циклы
Перед тем, как мы ознакомимся с тем, как работает range(), нам нужно взглянуть на то, как работают циклы. Циклы — это ключевая концепция компьютерных наук. Если вы хотите стать хорошим программистом, умение обращаться с циклами — это важнейший навык, который стоит освоить.
Рассмотрим пример цикла for в Python:
Выдача выглядит следующим образом:
Как вы видите, цикл for позволяет вам выполнять определенные части кода, столько раз, сколько вам угодно. В данном случае, мы зациклили список капитанов и вывели имена каждого из них.
Хотя Star Trek — отличная тема и все такое, вам может быть нужен более сложный цикл, чем список капитанов. Иногда вам нужно просто выполнить часть кода определенное количество раз. Циклы могут помочь вам с этим.
Попробуйте запустить следующий код с числами, кратными трем:
Выдача цикла будет выглядеть следующим образом:
Это выдача, которая нам нужна, так что можем сказать, что цикл выполнил работу адекватно, однако есть еще один способ получения аналогично результата: использование range().
Обратите внимание: Последний пример кода содержит определенное форматирование строк. Чтобы узнать больше об этой теме, перейдите на статью F-Строки в новой версии Python.
Теперь, когда вы знакомы с циклами поближе, посмотрим, как вы можете использовать range() для упрощения жизни.
Введение в range()
Итак, как работает функция Python под названием range? Простыми словами, range() позволяет вам генерировать ряд чисел в рамках заданного диапазона. В зависимости от того, как много аргументов вы передаете функции, вы можете решить, где этот ряд чисел начнется и закончится, а также насколько велика разница будет между двумя числами.
Вот небольшой пример range() в действии:
В этом цикле вы просто можете создать ряд чисел, кратных трем, так что вам не нужно вводить каждое из них лично.
Обратите внимание: хотя в этом примере показано надлежащее использование range(), его слишком часто приводят для использования в циклах.
Например, следующее использование range() едва ли можно назвать Питоническим (это плохой пример):
range() отлично подходит для создания повторяющихся чисел, но это не самый лучший выбор, если вам нужно перебрать данные, которые могут быть зациклены с помощью оператора in.
Есть три способа вызова range():
Вызывая range() с одним аргументом, вы получите ряд чисел, начинающихся с 0 и включающих каждое число до, но не включая число, которое вы обозначили как конечное (стоп).
Как это выглядит на практике:
Выдача вашего цикла будет выглядеть так:
Проверим: у нас есть все числа от 0 до, но не включая 3 — числа, которое вы указали как конечное.
range(старт, стоп)
Вызывая range() с двумя аргументами, вам нужно решить не только, где ряд чисел должен остановиться, но и где он должен начаться, так что вам не придется начинать с нуля каждый раз. Вы можете использовать range() для генерации ряда чисел, начиная с А до Б, используя диапазон (А, Б). Давайте узнаем, как генерировать диапазон, начинающийся с 1.
Попробуем вызывать range() с двумя аргументами:
Ваша выдача будет выглядеть следующим образом:
Отлично: у вас есть все числа от 1 (число, которые вы определили как стартовое), до, но не включая, 8 (число, которые вы определили как конечное).
Но если вы добавите еще один аргумент, то вы сможете воспроизвести ранее полученный результат, когда пользуетесь списком под названием numbers_divisible_by_three.
range(старт, стоп, шаг)
Вызывая range() с тремя аргументами, вы можете выбрать не только то, где ряд чисел начнется и остановится, но также то, на сколько велика будет разница между одним числом и следующим. Если вы не задаете этот «шаг», то range() автоматически будет вести себя так, как если бы шаг был бы равен 1.
Обратите внимание: шаг может быть положительным, или отрицательным числом, но он не может равняться нулю:
Если вы попробуете использовать 0 как шаг, вы получите ошибку ValueError.
Теперь, так как вы знаете, как использовать шаг, вы можете снова использовать цикл, который мы видели ранее, с числами, кратными 3.
Ваша выдача будет выглядеть абсолютно так же, как выдача для цикла for, которую мы видели ранее в данном руководстве, когда мы использовали список numbers_divisible_by_three:
Как вы видите в этом примере, вы можете использовать аргумент шаг для увеличения в сторону больших чисел. Это называется инкрементация.
Инкрементация с range()
Если вы хотите выполнить инкрементацию, то вам нужно, чтобы шаг был положительным числом. Чтобы понять, что под этим имеется ввиду, введите следующий код:
Если ваш шаг равен 25, то выдача вашего цикла будет выглядеть вот так:
Вы получили ряд чисел, каждое из которых больше предыдущего на 25, т.е., на заданный вами шаг.
Теперь, так как вы увидели то, как именно вы можете продвигаться вперед по диапазону, настало время узнать, как двигаться в обратную сторону.
Декрементация с range()
Если ваш шаг положительный — то вы двигаетесь по ряду увеличивающихся чисел, это называется инкрементация. Если ваш шаг отрицательный, то вы двигаетесь по ряду убывающих чисел, это называется декрементация. Это позволяет вам идти вспять.
В следующем примере ваш шаг будет -2. Это значит, что декрементация будет равна 2 для каждого цикла:
Выдача вашего декременирующего цикла будет выглядеть следующим образом:
У вас есть ряд чисел, каждое из которое меньше предшествующего на 2, т. е., на абсолютное значение предоставленного вами шага.
Самый правильный способ создание диапазона декрементации, это использовать range(старт, стоп, шаг). При этом в Python есть встроенная обратная функция. Если вы завернете range() в reversed(), то вы сможете выводить целые числа в обратном порядке.
Вы получите следующее:
range() позволяет итерировать по декрементирующей последовательности чисел, где reversed() обычно используется для циклического преобразования последовательности в обратном порядке.
Обратите внимание: reversed() также работает со строками.
Углубляемся в range()
Теперь, когда вы ознакомились с основами использования range(), настало время спуститься немного глубже.
Как правило, range() используется в двух случаях:
Первое использование можно назвать самым простым, и вы можете сделать так, чтобы itertools дал вам более эффективный способ построения итераций, чем это может сделать range().
Вот еще несколько моментов, которые стоит учитывать при использовании range.
Вы можете получить доступ к объектам в range() по индексу, как если бы вы имели дело со списком:
Вы даже можете использовать срез в range(), но выдача в REPL может показаться немного странной, на первый взгляд:
Хотя эта выдача может выглядеть необычно, range() просто возвращает еще одну range().
Тот факт, что вы можете использовать элементы range() по индексу и фрагменту range() указывает на важный момент: range() весьма ленивый, в отличие от списка, но не является итератором.
float и range()
Вы могли обратить внимание на то, что все числа, с которыми мы имели дело, являлись целыми числами. Это связано с тем, что range() может принимать только целые числа в качестве аргументов.
float
В Python, если число не является целым, оно является десятичным. Есть несколько различий между целыми и десятичными числами.
Целое число (тип данных int):
Десятичное число (тип данных float):
Попробуйте вызвать range() с десятичным числом и увидите, что будет:
Вы увидите следующее уведомление об ошибке TypeError:
Если вам нужен обходной путь, который позволит вам использовать десятичные числа, вы можете использовать NumPy.
Использование NumPy
NumPy – это сторонняя библиотека Python. Если вы собираетесь ее использовать, сначала вам нужно убедиться в том, что она установлена.
Как это сделать при помощи REPL:
Если вы получите ошибку ModuleNotFoundError, то вам нужно провести установку numpy. Чтобы сделать это, перейдите в командную строку и введите:
После установки, внесите следующее:
Если вы хотите вывести каждое число на свою строку, вы можете сделать следующее:
Выдача будет следующей:
Но откуда взялось число 0.8999999999999999?
У компьютеров есть проблемы с сохранением десятичных чисел с запятой в двоичные числа с запятой. Это приводит к разным неожиданным представлениям этих чисел.
Возможно, вы захотите взглянуть на библиотеку decimal, которая немного отстает в контексте производительности и читаемости, но позволяет вам выражать десятичные числа в точном виде.
Еще один вариант – использовать round(). Помните, что round() содержит собственные нюансы, которые могут приводить к неожиданным результатам!
Так или иначе, эти ошибки связанные с плавающей запятой являются проблемой, в зависимости от того, над какой задачей вы работаете. Ошибки могут быть выражены в виде, например, шестнадцатеричного десятичного числа, что не является критичной проблемой, в большинстве случаев. Они настолько маленькие, что, если вы только не работаете над расчетами орбитальной траектории спутников, вам не стоит беспокоиться.
В качестве альтернативы, вы можете использовать np.linspace(). Он делает в целом то же самое, но с использованием других параметров. С np.linspace() вы определяете начало и конец (оба включительно), а также длину и массив (за исключением шага).
Итоги
Теперь вы понимаете, как использовать range() и работать в обход его ограничений. Также вы понимаете, как эта важная функция развивалась между Python 2 и Python 3.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
Функция range в Python
Тип range (диапазон) является встроенной разновидностью данных в языке Python, которая предназначена для хранения информации об арифметической прогрессии целых чисел. Для ее генерации используется одноименная функция range с тремя различными параметрами. Диапазон обеспечивает комфортную работу с коллекциями при их циклической обработке.
Что такое диапазон?
Диапазон представляет собой неизменяемую последовательность целых чисел, которая чаще всего применяется для генерации более сложных наборов данных при помощи генераторов. Но в отличие от списков, кортежей, а также других стандартных коллекций, для обработки такого объекта всегда требуется одинаково малое количество памяти. Благодаря особому подходу к хранению данных, в память записываются не все элементы последовательности, а только ее длина, шаг и стартовая точка. Остальные данные вычисляются по мере необходимости.
Функция range
Для генерации диапазона нужно вызвать функцию range, передав ей от 1 до 3 целочисленных аргументов. В языке Python диапазон является самостоятельным объектом. Поэтому создать его можно с помощью присвоения результата работы range определенному идентификатору. Проверить, к какому классу принадлежит такой объект, можно с помощью метода type().
Рассмотрим описание функции range в Python 3. Как уже было сказано, она принимает несколько параметров:
Все указывать необязательно, так как start и step по умолчанию имеют значения 0 и 1 соответственно. Однако самостоятельно задать stop для диапазона все же необходимо.
Следующий пример демонстрирует результат работы функции range.
Таким образом, получилась последовательность с 10 целыми элементами, так как значения параметров start и step оставались по умолчанию. Попробуем добавить один аргумент.
Как видно из результатов выполнения программы, первый параметр функции range задает стартовое значение для будущей последовательности (3), в то время как второй отображает ее конечную границу (10). Однако, вопреки ожиданиям, число 10 не включается в итоговую последовательность. Добавим третий аргумент в функцию и посмотрим, что будет.
В данном случае задается диапазон чисел в Python 3 используя максимально возможное количество параметров, которые отвечают за начало (3), конец (10) и шаг (2). Таким образом, функция print вывела 4 целочисленных значения с одинаковым интервалом последовательности. Стоит всегда учитывать порядок расположения ее аргументов: start, stop и step. Все они могут обладать лишь целочисленным значением, как положительным, так и отрицательным.
Очень часто диапазоны используются для быстрой генерации списка либо другой коллекции чисел. Чтобы сделать это, необходимо всего лишь передать результат выполнения в качестве параметра для list. Следующий пример демонстрирует создание списка.
Вывод в обратном порядке
Благодаря реализации интерфейса collections.abc.Sequence ABC, объекты класса range можно обрабатывать различными способами, как списки или кортежи. Таким образом, диапазоны обладают возможностью проверки вхождения, поиска по индексу, среза или отрицательной индексации. В следующем примере показывается вывод списка в Python 3 c range в обратном порядке.
Для этого используется встроенная функция reversed, обрабатывающая последовательность некоторых данных и возвращающая каждый из ее элементов в противоположном порядке.
Различия между range и xrange
Иногда при работе со старым кодом, написанным во времена Python 2, можно повстречать метод под названием xrange. Он очень похож на стандартный range. Единственным отличием xrange от range является то, что при вызове первого создается новый объект типа range, а не обычный список класса list. В таком случае элементы последовательности не хранятся в памяти, а генерируются по ходу выполнения программы для экономии ресурсов.
Скорее всего, это было сделано для улучшения эффективности работы с большими последовательностями чисел. К примеру, в старых версиях языка использование функции range со значением, выше чем sys.maxsize, приводило к ошибке и завершению программы.
Заключение
Таким образом, тип range (диапазон) имеет массу путей применения, поскольку позволяет легко автоматизировать процесс заполнения различных наборов чисел. Как правило, для этой цели применяется функция range, в которой указан начальный элемент, граница и шаг последовательности. Благодаря реализации интерфейса коллекции, диапазоны обеспечивают проверку вхождения, поиск по индексу, срез и отрицательную индексацию элементов.