- Описание функции range с примерами для Python 3
- Параметры range: star, stop, шаг
- Примеры функции range()
- range против функций xrange в python
- Генерация диапазона с плавающей запятой в Python
- Чего Не Хватает В Функции Диапазона Python?
- Почему Python range() не работает с float?
- Использование Yield для генерации диапазона с плавающей запятой
- Функция NumPy Arange() для диапазона значений с плавающей запятой
- Функция NumPy Linspace для генерации диапазона с плавающей запятой
- Генерация диапазона с плавающей запятой без использования сторонних модулей
- Использование значения с плавающей запятой в параметре step
- Создать диапазон с плавающей запятой, используя Itertools
- Резюме
Описание функции range с примерами для Python 3
Если вы опытный разработчик, или даже новичок, вы, несомненно, слышали о функции Python range() . Но что же она делает? В двух словах, она генерирует список чисел, который обычно используется для работы с циклом for . Существует много вариантов использования. Зачастую, ее используют, когда нужно выполнить действие X раз, где вы можете использовать индекс. В других случаях вам, возможно, понадобится сделать итерацию по списку (или по другому итерируемому объекту), имея доступ к индексу.
Функция range() имеет небольшие отличия в работе на версии Python 2.x и 3.x , тем не менее у них остается одинаковая концепция. К этому вопросу мы доберемся немного позже.
Параметры range: star, stop, шаг
Функция range() принимает три параметра, например:
range([start], stop[, step])
- start: число начала последовательности.
- stop: генерирует число до данного числа, но не включая его.
- step: разница между каждым числом из последовательности.
- Все параметры должны быть целыми числами.
- Каждый из параметров может быть положительным или отрицательным.
- range() (и Python в целом) основана на индексе 0, означая, что список индексов начинается с 0, а не 1, например. Синтаксис, предоставляющий доступ к первому элементу в списке — mylist[0] . Поэтому, последнее целое число, сгенерированное функцией range() зависит от stop , но не будет включать его. Например, range(0, 5) генерирует целые числа 0, 1, 2, 3, 4, но не включая 5.
Примеры функции range()
Простое применение с циклом for:
>>> # 5 чисел начиная с 0 >>> for i in range(5): print(i) 0 1 2 3 4 >>> # числа с 3 до 6 (не включая его) >>> for i in range(3, 6): print(i) 3 4 5 >>> # числа с 4 до 10 (не включая его) с шагом 2 >>> for i in range(4, 10, 2): print(i) 4 6 8 >>> # числа с 0 до -10 (не включая его) с шагом -2 >>> for i in range(0, -10, -2): print(i) 0 -2 -4 -6 -8>>> my_list = ['один', 'два', 'три', 'четыре', 'пять'] >>> my_list_len = len(my_list) >>> for i in range(0, my_list_len): print(my_list[i]) один два три четыре пятьВ качестве параметра stop мы передали длину списка (5).
Range полезна в итерации с условиями. Рассмотрим примере песни “99 Bottles of Beer on the Wall…” со следующим кодом:
for i in range(99, 0, -1): if i == 1: print('1 bottle of beer on the wall, 1 bottle of beer!') print('So take it down, pass it around, no more bottles of beer on the wall!') elif i == 2: print('2 more bottles of beer on the wall, 2 more bottles of beer!') print('So take one down, pass it around, 1 more bottle of beer on the wall!') else: print(' bottles of beer on the wall, bottles of beer!'.format(i)) print('So take it down, pass it around, more bottles of beer on the wall!'.format(i - 1))Мы получаем следующий результат:
99 bottles of beer on the wall, 99 bottles of beer! So take one down, pass it around, 98 more bottles of beer on the wall! 98 bottles of beer on the wall, 98 bottles of beer! So take one down, pass it around, 97 more bottles of beer on the wall! 97 bottles of beer on the wall, 97 bottles of beer! So take one down, pass it around, 96 more bottles of beer on the wall! . 3 bottles of beer on the wall, 3 bottles of beer! So take one down, pass it around, 2 more bottles of beer on the wall! 2 more bottles of beer on the wall, 2 more bottles of beer! So take one down, pass it around, 1 more bottle of beer on the wall! 1 bottle of beer on the wall, 1 bottle of beer! So take it down, pass it around, no more bottles of beer on the wall!
Прекрасно! Наконец-то вы видите настоящую силу Python. Если вы еще немного в замешательстве, рекомендую прочитать статью 99 бутылок пива (Википедия).
range против функций xrange в python
Вы должно быть слышали о функции, известной как xrange() . Эта функция представлена в Python 2.x, и была переименована в range() в Python 3.x. Так в чем же разница? В Python 2.x range() создавала список, а xrange() возвращала итератор — объект последовательности. Мы можем увидеть это в следующем примере:
# Python 3.x >>> range(1) range(0, 1) >>> type(range(1)) range'> # Python 2.x >>> range(1) [0] >>> type(range(1)) list'>
В Python 3.x. у функции range() есть свой собственный тип. Говоря языком простых терминов, если вы хотите воспользоваться range() в цикле for , вы сделаете это с легкостью. Однако вы не можете использовать его как объект списка. Например, вы не можете разбить на срезы тип range .
Когда вы используете итератор, каждый цикл оператора for выдает мгновенно последующий номер на лету. В то время как исходная функция range() производит все числа мгновенно, прежде чем цикл for начнет выполняться.
Проблема с исходной функцией range() (в Python 2.x) заключалась в том, что она требовала очень большой объем памяти при создании большого количества чисел. Однако в нем, как правило, можно работать быстрее с небольшим количеством чисел.
Обратите внимание, что в Python 3.x вы все равно можете создать список, передав генератор, возвращенный функции list() . Следующим образом:
Генерация диапазона с плавающей запятой в Python
Вы хотите узнать, как генерировать диапазон чисел с плавающей запятой в Python? В этом руководстве вы найдете много способов получения значений с плавающей запятой в пределах заданного диапазона.
Мы рекомендуем вам по крайней мере использовать Python 3 для написания кода и запуска примеров. Python 2.x все еще получает обновления, но более новые версии более стабильны и продвинуты.
Чего Не Хватает В Функции Диапазона Python?
Диапазон Python может генерировать только набор целых чисел из данной полосы. Он также не допускает параметр типа с плавающей запятой и не может генерировать диапазон чисел с плавающей запятой.
Он принимает один, два или три параметра (старт / стоп / шаг). Однако все аргументы имеют целочисленный тип. Если вы передадите float, это приведет к ошибке TypeError.
start = 1 stop = 6.7 step = 0.1 for value in range(start, stop, step): print (value)Когда вы запускаете приведенный выше код, он выдает следующую ошибку:
TypeError: 'float' object cannot be interpreted as an integerПриведенный выше пример предполагает, что Python не предоставляет встроенного способа генерации диапазона с плавающей запятой. Поэтому нам нужно разработать собственную реализацию функции range.
Почему Python range() не работает с float?
Функция range генерирует конечный набор целых чисел. Вы можете определить размер, вычитая начальное значение из конечного значения (когда шаг = 1). Ниже приведена общая формула для расчета длины.
Проверьте примеры приведенные ниже, чтобы получить ясность.
>>> len(list(range(1,10,2))) 5 >>> 10-1/2 + 1 >>> (10-1)//2 + 1 5Однако тот же диапазон фактически имеет бесконечное количество из чисел с плавающей запятой. Вы можете ограничить его, используя фиксированное значение точности. Следовательно, это может быть возможной причиной того, что range() не позволяет работать с float.
Использование Yield для генерации диапазона с плавающей запятой
Вы можете написать пользовательскую функцию Python, как показано ниже. Это может позволить вам указать значение с плавающей запятой для аргумента шага.
import decimal def float_range(start, stop, step): while start < stop: yield float(start) start += decimal.Decimal(step) print(list(float_range(0, 1, '0.1')))[0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]Мы использовали модуль decimal для сохранения точности.
Функция NumPy Arange() для диапазона значений с плавающей запятой
Чтобы использовать функцию arange(), вам необходимо установить и импортировать пакет numpy. Эта библиотека имеет различные арифметические и числовые функции для генерации массивов / матриц разных размеров.
В любом случае, здесь мы будем использовать функцию arange() для генерации диапазона чисел с плавающей запятой.
Arange() имеет ту же сигнатуру, что и встроенный метод range. Но мы можем передать аргументы типа float (с плавающей запятой) в качестве параметров этой функции.
# Syntax import numpy arange(start, stop, step)Теперь давайте рассмотрим пример, чтобы улучшить наше понимание.
from numpy import arange print("Float range using NumPy arange():") print("\nTest 1:") for i in arange(0.0, 1.0, 0.1): print(i, end=', ') print("\n\nTest 2:") for i in arange(0.5, 5.5, 0.5): print(i, end=', ') print("\n\nTest 3:") for i in arange(-1.0, 1.0, 0.5): print(i, end=', ')Float range using NumPy arange(): Test 1: 0.0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6000000000000001, 0.7000000000000001, 0.8, 0.9 Test 2: 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0 Test 3: -1.0, -0.5, 0.0, 0.5Функция NumPy Linspace для генерации диапазона с плавающей запятой
У NumPy есть другой метод linspace(), позволяющий вам создать указанное количество чисел с плавающей запятой. Он имеет следующий синтаксис:
# Syntax linspace(start, stop, num, endpoint) start => starting point of the range stop => ending point num => Number of values to generate, non-negative, default value is 50. endpoint => Default value is True. If True, includes the stop value else ignores it.Эта функция имеет больше аргументов, но мы описали те, которые соответствуют нашей цели.
Посмотрите на приведенные ниже примеры.
import numpy as np print("Print Float Range Using NumPy LinSpace()\n") print(np.linspace(1.0, 5.0, num = 5)) print(np.linspace(0, 10, num = 5, endpoint = False))Print Float Range Using NumPy LinSpace() [1. 2. 3. 4. 5.] [0. 2. 4. 6. 8.]Если вы не хотите устанавливать пакет NumPy, попробуйте подход в следующем примере.
Генерация диапазона с плавающей запятой без использования сторонних модулей
Здесь мы предоставили простую программу на Python для генерации диапазона чисел с плавающей запятой. Он принимает как положительное так и отрицательное значение для аргументов.
Этот пример имеет 2 логических деления. Первый определяет функцию float_range(). Другой вызывает его с разными входными значениями и печатает результат.
""" Desc : This function generates a float range of numbers w/o using any library. Params : A (int/float) : First number in the range L (int/float) : Last number in the range D (int/float) : Step or the common difference """ def float_range(A, L=None, D=None): #Use float number in range() function # if L and D argument is null set A=0.0 and D = 1.0 if L == None: L = A + 0.0 A = 0.0 if D == None: D = 1.0 while True: if D > 0 and A >= L: break elif D < 0 and APrinting float range Test 1: 0.1, 0.6, 1.1, 1.6, 2.1, 2.6, 3.1, 3.6, 4.1, 4.6, Test 2: -5, -3.5, -2, -0.5, 1, 2.5, 4, Test 3: 0, 1, 2, 3, 4, 5, Test 4: 10.1, 11.1, 12.1, 13.1, 14.1, 15.1, 16.1, 17.1, 18.1, 19.1,Использование значения с плавающей запятой в параметре step
В пользовательской функции диапазона мы можем предоставить значение типа с плавающей запятой в качестве аргумента шага. Это позволит нам генерировать числа в определенном интервале.
Давайте рассмотрим пример, в котором в качестве значения шага указано 3.7.
import numpy as pynum_float print( "Display range using a float value in the step\n", pynum_float.arange(3, 33, 3.7) )Display range using a float value in the step [ 3. 6.7 10.4 14.1 17.8 21.5 25.2 28.9 32.6]Создать диапазон с плавающей запятой, используя Itertools
Мы также можем использовать модуль itertools и его функции, такие как islice() и count. Посмотрите на приведенный ниже пример, где мы написали простой метод для создания диапазона.
from itertools import islice, count def iter_range(start, stop, step): if step == 0: raise ValueError("Step could not be NULL") length = int(abs(stop - start) / step) return islice(count(start, step), length) for it in iter_range(0, 10, 1.10): print ("".format(it), end = " ")0.0 1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8Резюме
Хотелось бы, чтобы вы узнали, как генерировать диапазон чисел с плавающей запятой. Вы можете выбрать любой из методов, описанных выше, и использовать его в своих задачах.