- Описание функции range с примерами для Python 3
- Параметры range: star, stop, шаг
- Примеры функции range()
- range против функций xrange в python
- Range Python
- Введение в тему
- Range stop
- Range start stop step
- Функция python range с примерами
- Использование параметров start stop и step
- Использование отрицательных значений start stop и step
- Генерация диапазона как арифметический ряд
- Перебор списка с использованием range
- Преобразовать диапазон в список
- Верхний предел range включительно
- Использование индекса с результатом работы range python
- Объединить вывод двух функций range
- История range
- Инкрементация с range
- Декрементация с range
- Float и range
- Float
- Использование numpy
Описание функции 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() . Следующим образом:
Range Python
Основы
Введение в тему
Функция range в Python это одна из встроенных функций стандартной библиотеки. Она создаёт последовательность чисел типа int, от числа start до stop, с шагом step, указанными пользователем. Наиболее распространённое использование в циклах for.
Функция range() принимает обязательный и два необязательных параметра. В этом уроке мы Вы сможете изучить все возможности этой функции.
Range stop
Это главный способ использовать range(). Нужен всего один параметр для того чтобы задать верхнюю границу.
Последовательность чисел генерируется при таком варианте с нуля.
var = range(5) for _ in var: print(_) # Вывод: 0 1 2 3 4Range с нулём в качестве аргумента создаёт пустой диапазон.
var = range(0) for _ in var: print(_) print(var) # Вывод: range(0, 0)Range start stop step
Это немного более сложная форма range. Вы можете сгенерировать последовательность чисел более подробно задав необходимые параметры.
Для этого необходимо передать аргументы:
- start – От какого числа строить последовательность
- stop — До какого числа строить последовательность
- step — Шаг создания последовательности (по умолчанию равен 1)
- Нельзя устанавливать шаг равный нулю, иначе Вы получите ошибку ValueError.
- Значение, тип которого отличается от integer, вызывает TypeError.
- Ненулевое значение шага (> = stop) вернет диапазон, как минимум, состоящий из одного элемента.
Функция python range с примерами
Далее Вы можете увидеть листинги нескольких примеров.
Использование параметров start stop и step
for var in range(35, 39): print(var) print('='*5) for var in range(35, 39, 10): print(var) # Вывод: 35 36 37 38 ===== 35Использование отрицательных значений start stop и step
Каждый параметр функции range может быть отрицательными. Отрицательный аргумент step означает что последовательность будет создана с конца:
for var in range(-22, -39, -3): print(var, end=' ') print('\n', '='*10) for var in range(39, 22, -3): print(var, end=' ') # Вывод: -22 -25 -28 -31 -34 -37 ========== 39 36 33 30 27 24Генерация диапазона как арифметический ряд
Так же, при помощи функции range() можно создавать арифметические последовательности.
print(tuple(range(22, 39, 3))) # Вывод: (22, 25, 28, 31, 34, 37)Объект, возвращаемый функцией range() работает как generator. В этом коде он преобразуется в кортеж, и теперь мы можем вывести на экран значения.
Перебор списка с использованием range
Функцию range() можно использовать для перебора коллекций. Однако, такой приём использовать не рекомендуется как не «Питоничный» — для этого в языке есть более удобные встроенные инструменты.
var = ['Ivan', 'Olga', 'Rinat', 'Kira'] collection_len = len(var) for i in range(0, collection_len): print(var[i]) # Вывод: Ivan Olga Rinat KiraПреобразовать диапазон в список
Range() в Питон 3 создает объект сходный с генератором. При переборе значений range вычисляет их одно за другим, а не все сразу. Это называется ленивыми вычислениями и позволяет экономить задействованную память.
Результат вызова функции range() является immutable целочисленным набором. Это значит, что можно преобразовать то же самое в list, set или tuple Python.
import sys var = range(0, 5) print(type(var)) print('Используемая память -', sys.getsizeof(var), 'байт.') for i in var: print(var[i], end=' ') var = tuple(var) print('\n', type(var)) print('Используемая память -', sys.getsizeof(var), 'байт.') for i in var: print(var[i], end=' ') # Вывод: Используемая память - 48 байт. 0 1 2 3 4 Используемая память - 80 байт. 0 1 2 3 4Как Вы можете видеть, объект range занимает меньше памяти.
Верхний предел range включительно
По Python range() создаёт диапазон до значения, переданного как параметр stop, но само это значение не включает.
Однако можно добавить следующие изменения в код, чтобы изменить это поведение:
- Увеличьте значение stop используя счетчик шагов
- Передайте новое значение stop в функцию range()
start = 0 stop = 7 step = 1 for i in range(start, stop, step): print(i, end=" ") stop = stop + step print('\n', end="") for i in range(start, stop, step): print(i, end=" ") # Вывод: 0 1 2 3 4 5 6 0 1 2 3 4 5 6 7
Использование индекса с результатом работы range python
Range() создаёт уникальный объект, обладающий свойствами, сходными с коллекциями и генераторами. Благодаря этому можно использовать срезы совместно с range.
var = range(10) var = var[0:5] print(var) # Вывод: range(0, 5)Объединить вывод двух функций range
В Python объединить два объекта диапазона range() можно при помощи функции chain() из модуля itertools стандартной библиотеки.
from itertools import chain var = chain(range(5), range(5, 10)) for _ in var: print(_, end = " ") # Вывод: 0 1 2 3 4 5 6 7 8 9История range
Функция range в Python3 это переименованная функция xrange, взятая из Python2. Она отличается от функции range() из Python 2 тем что производит ленивые вычисления, то есть значения вычисляются по требованию, а не все сразу. Это сделано для оптимизации потребляемой памяти.
Подробнее можно изучить вопрос в PEP 3100.
Инкрементация с range
Для инкрементации необходимо использовать положительный шаг:
var = range(0, 50, 10) for _ in var: print(_, end = " ") # Вывод: 0 10 20 30 40В итоге цикл выдаёт коллекцию целых чисел, каждое из которых больше следующего на 10 (на заданный Вами шаг).
Декрементация с range
Для декрементации необходимо задать отрицательное приращение.
var = range(50, 0, -10) for _ in var: print(_, end = " ") # Вывод: 50 40 30 20 10В этом наборе чисел, каждое следующее меньше предшествующего на 10 (на заданный Вами шаг).
Ещё один способ сделать это – использовать встроенную функцию reversed().
var = range(0, 50, 10) var = reversed(var) for _ in var: print(_, end = " ") # Вывод: 40 30 20 10 0Float и range
В функцию range можно передавать исключительно целые числа как значения параметров. Соответственно, последовательность, сгенерированная этой функцией, тоже состоит из значений, имеющих тип integer.
Float
Если передать в функцию в качестве аргументов десятичные числа, язык выдаст исключение.
var = range(0.0, 50, 10) for _ in var: print(_, end = " ") # Вывод: Traceback (most recent call last): File "C:\Users\Dushenko\AppData\Roaming\JetBrains\PyCharm2021.1\scratches\scratch.py", line 1, in var = range(0.0, 50, 10) TypeError: 'float' object cannot be interpreted as an integerЕсли Вам необходим обходной путь, который позволит использовать действительные числа, Вам придётся использовать NumPy.
Использование numpy
NumPy – это сторонняя библиотека Python. Если вы собираетесь ее использовать, сначала вам нужно убедиться в том, что она установлена.
Если Вы получите ошибку ModuleNotFoundError, то вам нужно установить numpy. Чтобы сделать это, перейдите в командную строку и введите:
import numpy var = numpy.arange(0.3, 2, 0.3) for _ in var: print(_, end = " ") # Вывод: 0.3 0.6 0.8999999999999999 1.2 1.5 1.8У компьютеров существуют проблемы с сохранением действительных чисел в двоичные числа с запятой. Итогом этих проблем является неверное отображение этих чисел.
Вы можете ознакомиться с библиотекой decimal, которая позволяет выражать вещественные числа в точном виде.
Так же можно использовать метод numpy.linspace(). Он производит сходные действия, но с использованием других аргументов. С numpy.linspace() вы определяете start и stop включительно, а также длину массива.