Рубріки: Теория

Функция range в Python

Игорь Грегорченко

Функция range() в Python очень часто используется для создания коллекции из последовательных чисел на лету, например 0, 1, 2, 3, 4. Это очень практично, поскольку готовую последовательность чисел можно использовать для индексации коллекций или, например, для итерации в циклах. В данной статье мы рассмотрим все варианты использования range(), включая нестандартные совместно с float.

В этом уроке мы познакомимся с методом range() языка Python с помощью теории и нескольких закрепляющих примеров. Но сначала давайте дадим формальное определение этой функции.

Функция range() возвращает последовательность чисел, по умолчанию начинающуюся с 0, последовательно увеличивающуюся на 1 (по умолчанию) и останавливающуюся перед заданным числом.

Что делает функция Range в Python?

Функция range() возвращает неизменяемую последовательность чисел между заданным начальным целым числом и конечным целым числом.

Вот простейший пример, который проиллюстрирует сказанное:

print(list(range(6)))

# Output: [0, 1, 2, 3, 4, 5]

Для чего это нужно? Для перебора любых диапазонов из чисел, например, в этой нашей статье мы подробно рассматриваем использование range() в рамках циклов.

Чтобы разобраться во всех тонкостях Python, оптимальный вариант это общение с практикующим специалистом, чтобы ему можно было задать вопросы и получить ответы. Для этого идеальный вариант курсы от Powercode Академии и Mate Academy.

Введение в range()

Для начала предлагаю познакомиться с синтаксисом конструктора range().

Конструктор range() имеет две формы определения:

range(stop)

range(start, stop[, step])

 

Параметры range(старт, стоп, шаг)

range() принимает в основном три аргумента, которые одинаково используются в обоих определениях:

  • start — целое число, начиная с которого должна быть возвращена последовательность целых чисел;
  • stop — целое число, до которого должна быть возвращена последовательность целых чисел. Диапазон целых чисел заканчивается на stop – 1;
  • step (необязательно) – это целочисленное значение, определяющее шаг между каждым целым числом в последовательности.

range() Возвращаемое значение

range() возвращает неизменяемый объект из последовательности чисел в зависимости от используемых определений:

range(stop)

  • Возвращает последовательность чисел от 0 до stop – 1.
  • Возвращает пустую последовательность, если stop отрицателен или равен 0.

range(start, stop[, step])

Возвращаемое значение вычисляется по следующей формуле с заданными ограничениями:

r[n] = start + step*n (как для положительного, так и для отрицательного шага).

где, n >=0 и r[n] < stop (для положительного шага).

где, n >= 0 и r[n] > stop (для отрицательного шага).
  • (если step отсутствует) Шаг по умолчанию равен 1. Возвращает последовательность чисел, начинающуюся с start и заканчивающуюся на stop — 1.
  • (если step равен нулю) Вызывает исключение ValueError.
  • (если step ненулевой) Проверяет, выполняется ли ограничение на значение, и возвращает последовательность в соответствии с формулой.

Если ограничение на значение не выполняется, возвращается пустая последовательность.

Примеры функции

Пример 1: Как работает диапазон в Python?

# empty range
print(list(range(0)))

# using range(stop)
print(list(range(10)))

# using range(start, stop)
print(list(range(1, 10)))

Получим такой вывод:

[]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

Примечание: мы предварительно преобразовали диапазон в список Python, поскольку range() возвращает генератороподобный объект, который печатает вывод только по требованию.

Однако к объекту range, возвращаемому конструктором range, можно также обращаться по его индексу. Он поддерживает как положительные, так и отрицательные индексы.

Вы можете получить доступ к объекту range по индексу следующим образом:

rangeObject[index]

Пример 2: Создайте список четных чисел между заданными числами с помощью range():

Приведем пример:

start = 2
stop = 14
step = 2

print(list(range(start, stop, step)))

Вывод будет такой:

[2, 4, 6, 8, 10, 12]

Пример 3: Как range() работает с отрицательным шагом?

Приведем пример, где все очевидно:

start = 2
stop = -14
step = -2

print(list(range(start, stop, step)))

# value constraint not met
print(list(range(start, 14, step)))

Мы получим такой вывод:

[2, 0, -2, -4, -6, -8, -10, -12]
[]

Использование float с функцией range()

Python range() работает только с целыми числами. Она не поддерживает тип float, то есть мы не можем использовать число с плавающей точкой/десятичное значение в любом из ее аргументов.

Например, если вы используете range() с аргументом float step, вы получите ошибку TypeError 'float' object cannot be interpreted as an integer.

for i in range(0, 1, 0.1):
    print(i)
# Output TypeError: 'float' object cannot be interpreted as an integer

Диапазон плавающих значений с помощью функции arange() NumPy

Библиотека NumPy имеет различные числовые и математические функции для работы с многомерными массивами и матрицами.

В NumPy есть функция arange() для получения диапазона чисел с плавающей точкой. Она имеет тот же синтаксис и функциональность, что и встроенная в Python функция range(). Кроме того, она позволяет использовать числа с плавающей точкой в аргументах start, stop и step.

Синтаксис функции np.arange():

np.arange (start, stop, step)

Как сгенерировать диапазон плавающих чисел в Python

  • Установите модуль numpy
    NumPy не входит в стандартную установку Python. Вы можете установить его с помощью pip install numpy.
  • Импортируйте модуль numpy
    Импортируйте модуль numpy с помощью оператора import numpy as np.
  • Используйте numpy.arange()
    В качестве аргументов start, stop и step передавайте числа с плавающей точкой. Например, np.arange(0.5, 6.5, 1.5) вернет последовательность чисел с плавающей точкой, начиная с 0.5 и заканчивая 6.5.

Приведем пример:

import numpy as np

# range for floats with np.arange()
for i in np.arange(0, 4.5, 0.5):
    print(i, end=', ')
# Output 0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0,

# Example 2
for i in np.arange(5.5, 15.5, 2.5):
    print(i, end=' ')
# Output 5.5, 8.0, 10.5, 13.0,

Примечание: Как видно из результатов, мы получили десятичные числа от 0,0 до 4,0. Если вы заметили, np.arange() не включил 4,5 в свой результат, потому что он никогда не включает в свой результат число остановки. Функция останавливается перед тем, как сделать последний шаг.

Использование числа с плавающей точкой только в аргументе шага

Рассмотрим, как использовать шаг с плавающей точкой вместе с целыми числами start и stop в np.arange() для генерации чисел с плавающей точкой определенного интервала. В этом примере значение шага равно 2,5.

import numpy as np

# float step
for i in np.arange(1, 10, 2.5):
    print(i, end=', ')
# Output 1.0, 3.5, 6.0, 8.5

Обратный диапазон плавающих чисел

Используйте функцию reversed(), чтобы отобразить последовательность чисел float, полученную с помощью np.arange(), в порядке убывания.

import numpy as np

# reverse range of floats
for i in reversed(np.arange(5.5, 30.5, 5.5)):
    print(i, end=', ')
# Output 27.5, 22.0, 16.5, 11.0, 5.5,

Диапазон плавающих чисел с использованием генератора и yield

Что делать, если вы не хотите использовать библиотеку numpy только для функций arange() и linspace()?

В этом случае вы можете использовать генераторы Python и yield, чтобы написать пользовательскую функцию для генерации диапазона плавающих чисел.

Вы можете определить генератор для воспроизведения поведения встроенной функции Python range() таким образом, чтобы он мог принимать числа с плавающей точкой и выдавать диапазон плавающих чисел.

Следующий код разделен на две части.

  1. Пользовательская функция frange().
  2. Второй раздел тестирует пользовательскую функцию frange(), используя числа с плавающей точкой со следующими подходами:
    1. С положительными плавающими числами в аргументах frange().
    2. С отрицательными плавающими числами в аргументах frange().
    3. С отрицательными и положительными плавающими числами в аргументах frange().

Теперь давайте рассмотрим этот пример:

def frange(start, stop=None, step=None):
    # if set start=0.0 and step = 1.0 if not specified
    start = float(start)
    if stop == None:
        stop = start + 0.0
        start = 0.0
    if step == None:
        step = 1.0

    print("start = ", start, "stop = ", stop, "step = ", step)

    count = 0
    while True:
        temp = float(start + count * step)
        if step > 0 and temp >= stop:
            break
        elif step < 0 and temp <= stop:
            break
        yield temp
        count += 1


for i in frange(1.5, 5.5, 0.5):
    print("%g" % i, end=", ")
print('\n')

for i in frange(-0.1, -0.5, -0.1):
    print("%g" % i, end=", ")
print('\n')

for num in frange(0.5, 0.1, -0.1):
    print("%g" % num, end=", ")
print('\n')

for num in frange(0, 7.5):
    print("%g" % num, end=", ")
print('\n')

for num in frange(2.5, 7.5):
    print("%g" % num, end=", ")
print('\n')

Мы получим такой вывод:

start =  1.5 stop =  5.5 step =  0.5
 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 

start =  -0.1 stop =  -0.5 step =  -0.1
-0.1, -0.2, -0.3, -0.4, 

start =  0.5 stop =  0.1 step =  -0.1
0.5, 0.4, 0.3, 0.2, 

start =  0.0 stop =  7.5 step =  1.0
0, 1, 2, 3, 4, 5, 6, 7, 

start =  2.5 stop =  7.5 step =  1.0
2.5, 3.5, 4.5, 5.5, 6.5,

 

Подведение итогов

Функция range() в python создает коллекцию из последовательных чисел на лету, например 0, 1, 2, 3, 4. Это очень полезно, поскольку числа можно использовать для индексации коллекций, строк и т.д. Важно помнить, что функция range() может быть вызвана несколькими различными способами, все возможные варианты мы описали выше.

Во второй половине статьи показано также нестандартное использование функции совместно с float.

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

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

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023