Python xrange: разница между range и xrange

Содержание

разница между range и xrange

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

Что такое range и xrange?

В Python 2.x у нас было два основных метода для генерации списка целых чисел в заданном диапазоне.

Однако в Python 3 xrange() переименован в range().

Следовательно, в Python 3 мы получаем единственную функцию, которая может производить числа из заданного диапазона.

Функция range() в python 3.x — это просто повторная реализация xrange() в python 2.x и она на самом деле работает так же, как xrange.

Если вы используете Python 2.x, тогда разница между xrange() и range () значима для вас.

В чем же была разница в Python 2.x

Две функции диапазона имеют много разных черт. Они могут относиться к производительности, потреблению памяти, скорости и внутреннему дизайну. Каждый из них имеет свою реализацию. Теперь давайте рассмотрим каждое из этих отличий по одному.

Операционная разница

В большинстве случаев и xrange, и range работают одинаково. Они оба дают возможность составить список чисел.

Следовательно, мы можем сказать, что оба схожи с точки зрения функциональности. Давайте сейчас посмотрим несколько примеров:

Выражение range(1, 7, 2) даст результат [1, 3, 5], а xrange(1, 7, 2) — [1, 3, 5]. Следовательно, вы можете сделать вывод, что они имеют сходную схему исполнения и выходные данные.

Возвращаемые значения и тип

Это основной источник различий между функциями xrange и range.

Range() возвращает объект типа list. Например, выражение range(1, 100, 1) создаст диапазон чисел от 0 до 99 и вернет все цифры за один раз.

>>> r = range(1, 100, 1)
>>> type(r)

>>> len(r)
99

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

Объект xrange допускает итерацию, индексацию и метод len(). Вы можете использовать его в цикле for, чтобы обойти и получать числа в каждой итерации.

>>> xr = xrange(1, 100, 1)
>>> type(xr)

>>> xr[0]
1
>>> for it in xr:
...    print(it)
...
1
2
3
...
99

Python xrange vs. range — кто быстрее?

У нас есть модуль timeit в Python для захвата времени выполнения любой функции. Мы будем использовать его в нашем тесте и посмотрим, какой из них быстрее.

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

>>> import timeit
>>> timeit.timeit('"-".join(str(num) for num in range(10000))', number=10000)
22.56510010000011
>>> timeit.timeit('"-".join(str(num) for num in range(10000))', number=10000)
22.796818399999893
>>> timeit.timeit('"-".join(str(num) for num in range(10000))', number=10000)
24.003325399999994

Мы снова провели один и тот же тест с xrange() три раза и записали время их выполнения.

>>> timeit.timeit('"-".join(str(num) for num in xrange(10000))', number=10000)
20.672853799999984
>>> timeit.timeit('"-".join(str(num) for num in xrange(10000))', number=10000)
20.471903500000053
>>> timeit.timeit('"-".join(str(num) for num in xrange(10000))', number=10000)
20.15995029999999

Из приведенных выше тестов и результатов вы можете оценить, что xrange быстрее, чем стандартная функция диапазона.

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

Вот некоторые факты для вашей справки:

  • Основная проблема со стандартной функцией range() заключается в том, что она потребляет значительный объем памяти, особенно для большего диапазона чисел.
  • Функция xrange() всегда предоставляет следующий элемент по запросу. Это означает, что в памяти одновременно существует только один элемент. Следовательно, он потребляет меньше памяти.

Что предпочесть range или xrange?

Это компромисс между мгновенным результатом и сегментированным выходом. С помощью xrange мы получаем более быстрый ответ; Кроме того, он потребляет меньше памяти.

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

Где предпочтительно использовать xrange()?
  • Когда диапазон имеет более широкий охват, мы рекомендуем использовать xrange(). Это улучшит скорость и потребует меньше памяти.
  • Если вы планируете работать на маломощных устройствах (которые имеют ограничения памяти), тогда с xrange() вы можете не увидеть проблем с буфером.
Где предпочтительно использовать range()?
  • Когда вам приходится часто просматривать список, лучше использовать range(). С xrange() было бы непросто создать экземпляр целочисленного объекта для каждого запроса на индексирование.
  • Если вы используете небольшой диапазон, то использование функции range() — правильная идея.
  • Так как метод range возвращает объект списка, вы можете использовать все его функции. Напротив, xrange предоставляет голый целочисленный объект, который требует индексации.
  • Интересно, что если вы хотите, чтобы ваш код Python 2.x был совместим с версией 3.x, вам также следует использовать метод range.

Совместимость Между Python И Xrange

В Python 3.x функция xrange не существует, тогда как она предоставляет функцию range(). Реальность такова, что название «xrange» изменилось на «range» в Python 3.x.

Таким образом, если вы выполните вызов xrange() в Python 3.x, это вызовет приведенную ниже ошибку.

NameError: name ‘xrange’ is not defined

Кроме того, если вы решите импортировать xrange, даже тогда произойдет следующая ошибка.

ImportError: No module named ‘xrange’

Следовательно, вы можете решить использовать range() вместо xrange() для обеспечения совместимости между различными версиями.

range () против xrange () в Python

range () и xrange () — это две функции, которые можно использовать для итерации определенного числа циклов for в Python. В Python 3 нет xrange, но функция диапазона ведет себя как xrange в Python 2. Если вы хотите написать код, который будет работать как на Python 2, так и на Python 3, вы должны использовать range ().

range () — возвращает список чисел, созданных с помощью функции range ().
xrange () — эта функция возвращает объект генератора, который может использоваться для отображения чисел только путем зацикливания. По запросу отображается только определенный диапазон, и поэтому он называется « отложенная оценка ».

Оба реализуются по-разному и имеют разные характеристики, связанные с ними. Точки сравнения:

  • Тип возврата
  • Память
  • Использование операции
  • скорость

Тип возврата

range () возвращает — список как тип возвращаемого значения.
xrange () возвращает — объект xrange () .

  

a = range(1,10000)

  

x = xrange(1,10000)

  

print ("The return type of range() is : ")

print (type(a))

  

print ("The return type of xrange() is : "

)

print (type(x))

Выход:

The return type of range() is : 

The return type of xrange() is : 

Память

Переменная, хранящая диапазон, созданный range (), занимает больше памяти по сравнению с переменной, хранящей диапазон, используя xrange (). Основной причиной этого является тип возвращаемого значения range () — list, а xrange () — объект xrange ().

  

import sys

  

a = range(1,10000)

  

x =

xrange(1,10000)

  

print ("The size allotted using range() is : ")

print (sys.getsizeof(a))

  

print ("The size allotted using xrange() is : ")

print (sys.getsizeof(x))

Выход:

The size allotted using range() is : 
80064
The size allotted using xrange() is : 
40

Использование операций

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

  

a = range(1,6)

  

x = xrange(1,6)

  

print ("The list after slicing using range is : ")

print (a[2:5])

  

print ("The list after slicing using xrange is : ")

print (x[2:5])

Ошибка:

Traceback (most recent call last):
  File "1f2d94c59aea6aed795b05a19e44474d.py", line 18, in 
    print (x[2:5])
TypeError: sequence index must be integer, not 'slice'

Выход:

The list after slicing using range is : 
[3, 4, 5]
The list after slicing using xrange is : 

скорость

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

Важные моменты:

  • Если вы хотите написать код, который будет работать как на Python 2, так и на Python 3, используйте range (), так как функция xrange устарела в Python 3
  • range () работает быстрее, если повторять одну и ту же последовательность несколько раз.
  • xrange () должен каждый раз восстанавливать целочисленный объект, но range () будет иметь реальные целочисленные объекты. (Это всегда будет работать хуже с точки зрения памяти, однако)

Эта статья предоставлена Манджитом Сингхом . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи [email protected] Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

range () против xrange () в Python

0.00 (0%) 0 votes

4.3. Функции range() и xrange() — Язык программирования Python — Програмирование — Инструкции

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

 

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 

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

 

>>> range(5, 10)
[5, 6, 7, 8, 9]
>>> range(0, 10, 3)
[0, 3, 6, 9]
>>> range(-10, -100, -30)
[-10, -40, -70]

 

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

 

>>> a = [‘У’, ‘Матери’, ‘есть’, ‘маленькая’, ‘овечка’]
>>> for i in range(len(a)):
…     print i, a[i]

0 У
1 Матери
2 есть
3 маленькая
4 овечка

 

Дотошный читатель может заметить, что если нужно перебирать числа большого диапазона, создание списка будет неоправданно, а в некоторых случаях просто не хватит памяти:

 

>>> l=range(1000000000)
Traceback (most recent call last):
  File «<stdin>», line 1, in <module>
MemoryError

 

Действительно, если мы не собираемся изменять список, достаточно создать псевдосписок — объект, для которого мы можем получить значения «элементов», но не можем изменить их или порядок их следования. Для этих целей в языке Python предусмотрена функция xrange():

 

>>> xrange(5, 10)
xrange(5, 10)
>>> xrange(0, 10, 3)
xrange(0, 12, 3)
>>> xrange(-10, -100, -30)
xrange(-10, -100, -30)
>>> a = [‘У’, ‘Матери’, ‘есть’, ‘маленькая’, ‘овечка’]
>>> for i in xrange(len(a)):
…     print i, a[i]

0 У
1 Матери
2 есть
3 маленькая
4 овечка

 

Диапазон в Python | ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

Тип range в Python генерирует последовательность целых чисел, определяя начальную и конечную точку диапазона. Обычно используется с циклом for в Python для итерации по последовательности чисел.

range() работает по-разному в Python 2 и 3.

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

В Python 3 функция xrange была удалена, а функция range ведет себя подобно xrange в Python 2. range в Python 3 – это не функция, а тип, представляющий неизменяемую последовательность чисел.

В этой статье мы рассмотрим основы типа range в Python 3.

 

Синтаксис range() в Python

range принимает следующие формы:

range(stop)
range(start, stop[, step])

Аргументы, предоставляемые range, должны быть целыми числами. Плавающие числа и другие типы не допускаются.

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

 

range(stop) в Python

Когда предоставлен только один аргумент, range возвращает последовательность чисел, увеличивается на 1, начиная с 0 и заканчивая – 1.

Вот тип диапазона в действии:

for i in range(5):
    print(i)

 

Сгенерированная последовательность чисел начинается с 0 и заканчивается на 4 (5-1):

0
1
2
3
4

 

Если аргумент равен 0 или отрицательное целое число, range возвращает пустую последовательность:

print(list(range(-5)))

 

Мы конвертируем объект range в список, потому что range выполняет ленивую оценку целочисленной последовательности. На выходе получается пустой список:

[]

 

range(start, stop) в Python

Когда предусмотрены два аргумента, range возвращает последовательность чисел, увеличивается на 1, начиная с start к stop – 1.

Вот пример:

for i in range(3, 5):
    print(i)

 

3
4

 

Аргумент stop должен быть больше start. В противном случае последовательность будет пуста:

print(list(range(5, 3)))

 

[]

 

Вы можете использовать положительные и отрицательные целые числа в качестве аргументов:

print(list(range(-5, -3)))

 

[-5, -4]

 

print(list(range(-3, 0)))

 

[-3, -2, -1]

 

range(start, stop, step) в Python

Когда задано три аргумента, range возвращает последовательность чисел, увеличиваются или уменьшаются на step, начиная с start к stop – 1.

Если step положительный, range возвращает последовательность, которая увеличивается:

for i in range(0, 26, 5):
    print(i)

 

0
5
10
15
20
25

 

При увеличении аргумента stop должен быть больше чем start. В противном случае последовательность пуста.

Если step отрицательный, то range возвращает последовательность, которая уменьшается:

for i in range(20, 4, -5):
    print(i)

 

20
15
10
5

 

При уменьшении аргумента stop должен быть меньше чем start. В противном случае последовательность пуста.

Если step равно 0, вызывается исключение ValueError:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: range() arg 3 must not be zero

 

Вывод

Тип range в Python позволяет генерировать последовательность целых чисел. В основном используется в циклах for в Python.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

44) Диапазон Python () — CoderLessons.com

Что такое Python Range?

Python range () — это встроенная функция, доступная в Python из Python (3.x), и она дает последовательность чисел на основе заданного индекса начала и конца. Если начальный индекс не указан, он считается равным 0 и будет увеличивать значение на 1 до конечного индекса.

Например, range (5) выведет вам значения 0,1,2,3,4. Python range () — очень полезная команда, и в основном она используется, когда вам приходится повторять цикл for.

В этом уроке вы узнаете:

Синтаксис

range(start, stop, step)

параметры

  • start: (необязательно) начальный индекс представляет собой целое число, и, если он не указан, значением по умолчанию является 0.
  • stop: индекс остановки определяет значение, при котором функция диапазона должна остановиться. Это обязательный вход для функции дальности. Последнее значение всегда будет на 1 меньше значения остановки.
  • step: (необязательно). Значение шага — это число, на которое следует увеличить следующий номер диапазона, по умолчанию оно равно 1.

Возвращаемое значение:

Возвращаемое значение представляет собой последовательность чисел от заданного индекса начала до конца.

Python range () Функция и история

Python range () был введен в Python версии 3, до этого функция xrange () была функцией.

И range, и xrange () используются для создания последовательности чисел.

Ниже приведены различия между range и xrange ():

спектр() xrange ()
Range () дает последовательность чисел и возвращает список чисел. Функция xrange () предоставляет объект-генератор, который необходимо зациклить в цикле for для получения значений.
Range () возвращает список. xrange () возвращает объект генератора.
Метод range () использует больше памяти, поскольку возвращаемый список должен быть сохранен по сравнению с xrange (). Поскольку xrange () возвращает объект генератора, он не дает значения мгновенно и должен использоваться внутри цикла for для получения значений.
Использование памяти больше, поэтому выполнение кода происходит медленно при работе с огромным набором данных. Выполнение кода быстрее с использованием xrange ().

Использование range ()

В этом примере показано, как распечатать значения от 0 до 9, используя range ().

Значение, используемое в диапазоне, равно 10, поэтому выходной сигнал равен 0 1 2 3 4 5 6 7 8 9

Поскольку старт не задан, старт рассматривается как 0, а последнее значение дается до 9. Последнее значение всегда на 1 меньше заданного значения, т. Е. Стоп-1.

for i in range(10):
    print(i, end =" ")

Вывод:

0 1 2 3 4 5 6 7 8 9

Использование запуска и остановки в диапазоне ()

В коде начальное значение равно 3, а конечное значение равно 10. Здесь начальный индекс равен 3, поэтому последовательность чисел будет начинаться с 3 до конечного значения. Последнее значение в последовательности будет на 1 меньше значения остановки 10-1 = 9.

for i in range(3, 10):
    print(i, end =" ")

Вывод:

3 4 5 6 7 8 9

Используя старт, стоп и шаг

Начальное значение равно 3, поэтому последовательность чисел будет начинаться с 3. Стоповое значение равно 10, поэтому последовательность чисел будет останавливаться на (10-1), т. Е. 9. Шаг 2, поэтому каждое значение в последовательности будет увеличивается на 2. Если значение шага не задано, значением шага по умолчанию является 1.

for i in range(3, 10, 2):
    print(i, end =" ")

Вывод:

3 5 7 9

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

Увеличение значений в диапазоне с использованием положительного шага.

Параметр step in range () может использоваться для увеличения / уменьшения значений. По умолчанию это положительное значение 1. Таким образом, оно всегда будет давать увеличенные значения.

Значение шага должно быть положительным в том случае, если вы хотите, чтобы в качестве выходного значения были увеличены значения.

for i in range(1, 30, 5):
    print(i, end =" ")

Вывод:

1 6 11 16 21 26

Обратный диапазон: уменьшение значений с использованием отрицательного шага.

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

for i in range(15, 5, -1):
    print(i, end =" ")

Вывод:

15 14 13 12 11 10 9 8 7 6

Начальное значение равно 15, конечное значение равно 5, а значение шага является отрицательным числом, т.е. -1. С указанными выше функциями range () будет уменьшать значение с 15 и далее до тех пор, пока оно не достигнет значения останова, но здесь разница в том, что последним значением будет stop + 1.

Использование плавающих чисел в Python range ()

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

Пример:

for i in range(10.5):
    print(i, end =" ")

В приведенном выше примере мы использовали стоп-значение как 10,5.

Выход:

Traceback (most recent call last):
  File "python_range.py", line 1, in <module>
    for i in range(10.5):
TypeError: 'float' object cannot be interpreted as an integer

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

Использование цикла for с Python range ()

В этом примере мы будем использовать массив чисел и, давайте посмотрим, как использовать итерацию массива внутри цикла for с помощью range ()

Пример:

arr_list = ['Mysql', 'Mongodb', 'PostgreSQL', 'Firebase']

for i in range(len(arr_list)):
    print(arr_list[i], end =" ")

Вывод:

MysqlMongodb PostgreSQL Firebase

В приведенном выше примере мы использовали len (arr_list) в качестве значения остановки. Цикл for будет повторяться до конечного значения, то есть длины массива, и это будет 4, поскольку у нас есть четыре элемента в arr_list. Начальное значение будет 0, а шаг будет 1. Так что значения начнутся с 0 и остановятся на 3, то есть длина массива -1 означает 4 -1 = 3.

Использование Python range () в качестве списка

В этом примере вы увидите, как использовать выходные данные диапазона в виде списка.

Пример:

print(list(range(10)))

Вывод:

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

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

Использование символов в диапазоне Python ()

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

Пример:

for c in range ('z'):
        print(c, end =" ")

Вывод:

Traceback (most recent call last):
  File "python_range.py", line 1, in <module>
    for c in range ('z'):
TypeError: 'str' object cannot be interpreted as an integer

Выдает ошибку, говоря, что строку нельзя интерпретировать как целое число.

Чтобы получить список алфавитов, вы можете настроить код и получить желаемый результат, как показано ниже:

Пример:

def get_alphabets(startletter, stopletter, step):
    for c in range(ord(startletter.lower()), ord(stopletter.lower()), step):
        yield chr(c)

print(list(get_alphabets("a", "h", 1)))

Вывод:

['a', 'b', 'c', 'd', 'e', 'f', 'g']

Как получить доступ к элементам диапазона

Вы можете использовать цикл for для получения значений из диапазона или использовать индекс для доступа к элементам из range ().

Использование цикла for

Пример:

for i in range(6):
    print(i)

Вывод:

0
1
2
3
4
5

Используя индекс

Индекс используется с диапазоном, чтобы получить значение, доступное в этой позиции. Если значение диапазона равно 5, чтобы получить начальное значение, вы можете использовать диапазон (5) [0] и следующий диапазон значений (5) [1] и так далее.

Пример:

startvalue = range(5)[0] 
print("The first element in range is = ", startvalue) 

secondvalue = range(5)[1] 
print("The second element in range is = ", secondvalue) 

lastvalue = range(5)[-1]
print("The first element in range is = ", lastvalue)

Вывод:

startvalue = range(5)[0] 
print("The first element in range is = ", startvalue) 

secondvalue = range(5)[1] 
print("The second element in range is = ", secondvalue) 

lastvalue = range(5)[-1]
print("The first element in range is = ", lastvalue)

Использование списка ()

Этот метод напечатает все элементы из диапазона (). Используя list (), он вернет элементы из range () в формате списка.

Пример:

print(list(range(10)))

Вывод:

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

Это дает вывод списка для данного диапазона.

Пример: получить четные числа с помощью range ()

Используя range (), вы получите список четных чисел в диапазоне, заданном в качестве входных данных. Параметры для range (): start — 2, stop — 20, step — 2, поэтому значения будут увеличены на 2 и будут давать четные числа до stop-2.

Пример:

for i in range(2, 20, 2):
    print(i, end =" ")

Вывод:

2 4 6 8 10 12 14 16 18

Объединение двухдиапазонных () выходов

В этом примере будут объединены 2 функции range () с помощью функции itertools module chain ().

Пример:

from itertools import chain 

print("Merging two range into one") 
frange =chain(range(10), range(10, 20, 1))
for i in frange: 
    print(i, end=" ")

Вывод:

Merging two range into one
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

Использование range () с NumPy

Модуль NumPy имеет функцию arange (), которая работает и выдает аналогичные выходные данные, как range (). Range () принимает те же параметры, что и range ().

Синтаксис:

arange(start, stop, step)

Для работы с NumPy выполните следующие действия.

Шаг 1 : Импортировать модуль NumPy

import numpy

Incase во время выполнения выдает ошибку о том, что numpy модуль не найден, вам необходимо установить модуль, как показано в шаге 2.

Шаг 2 : Установите NumPy

pip install numpy

Шаг 3 : Рабочий пример arange () с использованием NumPy

import numpy as np 

for  i in np.arange(10):
   print(i, end =" ")        

Вывод:

0 1 2 3 4 5 6 7 8 9

Числа с плавающей точкой, используя NumPy arange ()

Невозможно получить последовательность с плавающей запятой, используя range (), но это возможно, используя NumPy arange ().

Пример:

Диапазон, который мы хотим, составляет от 0,5 до 1,5. Значение будет увеличено на 0,2.

import numpy as np 

for  i in np.arange(0.5, 1.5, 0.2):
   print(i, end =" ")        

Вывод:

0.5 0.7 0.8999999999999999 1.0999999999999999 1.2999999999999998

Вывод, который мы получаем, немного странный, некоторые числа с плавающей запятой показаны с 16 десятичными разрядами. Это происходит из-за сложности хранения десятичных чисел с плавающей запятой в двоичном формате. Вы также можете округлить значения, если необходимо, и ограничить их десятичными разрядами, которые вам нужны.

Резюме:

  • Python range () — это встроенная функция, доступная в Python из Python (3.x), и она дает последовательность чисел на основе заданного индекса начала и конца. Если начальный индекс не указан, он считается равным 0 и будет увеличивать значение до конечного индекса.
  • Python range () был введен в Python версии 3, до этого функция xrange () была функцией.
  • Range () дает последовательность чисел и возвращает список чисел. Функция xrange () предоставляет объект-генератор, который необходимо зациклить в цикле for для получения значений.
  • Параметр step in range () может использоваться для увеличения / уменьшения значений. По умолчанию это положительное значение 1. Таким образом, оно всегда будет давать увеличенные значения.
  • Python выдает ошибку для чисел с плавающей точкой, так как функция range () поддерживает только целочисленные значения.
  • Доступ к значениям из range () можно получить с помощью цикла for, используя index и list ().
  • Модуль NumPy имеет функцию arange (), которая работает и выдает аналогичные выходные данные, как range (). Arange () принимает те же параметры, что и range ().
  • Можно получить последовательность с плавающей точкой NumPy arange (), которая не поддерживается с помощью range ().

 

Python: range не является итератором!

После моего выступления в Loop Better на PyGotham 2017 кто-то задал мне отличный вопрос: iterator — это lazy iterable (iterable это итерируемый объект а lazy означает отложенное действие прим. переводчика), и range — это lazy iterable в Python 3? Является ли range итератором?

К сожалению, я не помню имя человека, который задал мне этот вопрос. Я помню, что говорил что-то вроде «о, я люблю этот вопрос!»

Мне нравится этот вопрос, потому что range объекты в Python 3 (xrange в Python 2) действительно объекты с отложенным действием то есть lazy, но range объекты не являются итераторами, и это то, что, как я вижу, люди часто путают.

В прошлом году я много раз слышал, что новички в Python, опытные программисты Python и даже другие инструкторы Python ошибочно называют range объекты в Python 3 итераторами. Это особенность часто путает многих людей.

Да это сбивает с толку

Когда люди говорят об итераторах (iterators) и итерируемых объектах (iterables) в Python, вы, вероятно, слышите, как кто-то повторяет неправильное представление о том, что range является итератором. Поначалу эта ошибка может показаться несущественной, но я думаю, что на самом деле она довольно критична. Если вы считаете, что range объекты являются итераторами, ваши представления о работе итераторов в Python не верны. И range, и итераторы в некотором смысле «ленивы», но они ленивы по-разному.

В этой статье я собираюсь объяснить, как работают итераторы, как работает range, и как отличается лень этих двух типов «ленивых итераций».

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

Что такое итератор (iterator)?

В Python итерируемый объект (iterable) — это любой объект, предоставляющий возможность поочерёдного прохода по своим элементам, а итератор (iterator) — это то, что выполняет реальный проход.

Вы можете получить итератор из любого итерируемого объекта в Python, используя функцию iter:

>>> iter([1, 2])
<list_iterator object at 0x7f043a081da0>
>>> iter('hello')
<str_iterator object at 0x7f043a081dd8>

Если у вас есть итератор, единственное, что вы можете с ним сделать — это получить следующий элемент с помощью функции next:

>>> my_iterator = iter([1, 2])
>>> next(my_iterator)
1
>>> next(my_iterator)
2

Вы получите исключение остановки итерации StopIteration, если запросите следующий элемент, но при этом все элементы будут пройдены:

>>> next(my_iterator)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

И удобно, и несколько запутанно, все итераторы тоже итерируемы. Это означает, что вы можете получить итератор из итератора (то есть он вернет себя сам). То есть вы также можете перебирать итератор:

>>> my_iterator = iter([1, 2])
>>> [x**2 for x in my_iterator]
[1, 4]

Важно отметить, что у итераторов есть состоянием. То есть, как только вы получили элемент из итератора, он удаляется из итератора (а не из источника данных) . Поэтому после того, как вы пройдете по всем элементам один раз, итератор будет пуст:

>>> my_iterator = iter([1, 2])
>>> [x**2 for x in my_iterator]
[1, 4]
>>> [x**2 for x in my_iterator]
[]

В Python 3 функции enumerate, zip, reversed и ряд других встроенных функций возвращают итераторы:

>>> enumerate(numbers)
<enumerate object at 0x7f04384ff678>
>>> zip(numbers, numbers)
<zip object at 0x7f043a085cc8>
>>> reversed(numbers)
<list_reverseiterator object at 0x7f043a081f28>

Генераторы (будь то из функции генератора или выражения генератора generator expressions) являются одним из наиболее простых способов создания собственных итераторов:

>>> numbers = [1, 2, 3, 4, 5]
>>> squares = (n**2 for n in numbers)
>>> squares
<generator object <genexpr> at 0x7f043a0832b0>

Я часто говорю, что итераторы — это ленивые одноразовые итерации. Они «ленивы», потому что у них есть возможность вычислять элементы, только тогда когда вы проходите через них. И они «одноразовые», потому что как только вы «получили (consumed)» элемент из итератора, он исчезнет навсегда. Термин «исчерпан (exhausted)» часто используется для полностью использованного итератора.

Это было краткое изложение того, что такое итераторы. Если вы раньше не сталкивались с итераторами, я бы порекомендовал почитать о них больше, прежде чем продолжить. Я написал статью, в которой объясняются итераторы, и я выступил с докладом Loop Better, о котором я упоминал ранее, в ходе которого я углубился в итераторы.

Чем отличается range?

Хорошо, мы рассмотрели итераторы. Давайте сейчас поговорим о range.

Объект range в Python 3 (xrange в Python 2) может быть пройден как любой другой итерируемый объект:

>>> for n in range(3):
...     print(n)
...
0
1
2

И так как range является итеративным, мы можем получить итератор из него:

>>> iter(range(3))
<range_iterator object at 0x7f043a0a7f90>

Но сами объекты range не являются итераторами. Мы не можем вызвать next для объекта range:

>>> next(range(3))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'range' object is not an iterator

И в отличие от итератора, мы можем перебрать объект range без его опустошения (consuming):

>>> numbers = range(3)
>>> tuple(numbers)
(0, 1, 2)
>>> tuple(numbers)
(0, 1, 2)

Если бы мы сделали это с помощью итератора, мы не получили бы элементов при втором прохождение:

>>> numbers = iter(range(3))
>>> tuple(numbers)
(0, 1, 2)
>>> tuple(numbers)
()

В отличие от объектов zip, enumerate или generator объекты range не являются итераторами.

Так что такое range?

Объект range в некотором смысле является «ленивым» , потому что он не генерирует все числа, которые он «содержит», сразу когда мы его создаем. Вместо этого он дает нам эти числа, когда они нам нужны.

Создадим для примера объект range и генератор (который является итератором):

>>> numbers = range(1_000_000)
>>> squares = (n**2 for n in numbers)

В отличие от итераторов, объекты range имеют длину:

>>> len(numbers)
1000000
>>> len(squares)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'generator' has no len()

И они могут быть проиндексированы:

>>> numbers[-2]
999998
>>> squares[-2]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'generator' object is not subscriptable

И в отличие от итераторов, вы можете спросить их, содержат ли они объекты, не меняя их состояния:

>>> 0 in numbers
True
>>> 0 in numbers
True
>>> 0 in squares
True
>>> 0 in squares
False

Если вы ищете определение для объектов range, вы можете назвать их «ленивые последовательности (lazy sequences)». Они представляют собой последовательности Sequence (такие же как списки, кортежи и строки), но на самом деле они не содержат никакой памяти или состояния и вместо этого отвечают на вопросы в вычислительном отношении.

>>> from collections.abc import Sequence
>>> isinstance([1, 2], Sequence)
True
>>> isinstance('hello', Sequence)
True
>>> isinstance(range(3), Sequence)
True

Что это отличие означает?

Может показаться, что я придираюсь к тому, чтобы сказать, что range не является итератором, но я действительно не думаю, что это так.

Если я скажу вам, что что-то является итератором, вы будете знать, что когда вы вызовете iter для него, вы всегда получите тот же объект (по определению):

>>> iter(my_iterator) is my_iterator
True

И вы будете знать, что вы можете вызывать next на нем, потому что вы можете вызывать next на всех итераторах:

>>> next(my_iterator)
4
>>> next(my_iterator)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

И вы будете подразумевать, что элементы будут исчезать из итератора, когда вы проходить по нему. Иногда эта особенность может пригодиться для обработки итераторов определенными способами:

>>> my_iterator = iter([1, 2, 3, 4])
>>> list(zip(my_iterator, my_iterator))
[(1, 2), (3, 4)]

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

Когда вы сомневаетесь говорите “iterable” или “lazy iterable”

Если вы знаете, что можете пройти по списку каких либо элементов говорите что, это iterable.

Если вы знаете, что вычисление происходит только в момент прохождения то, это будет lazy iterable.

Если вы знаете, что можете использовать функцию next, то это итератор (iterator) (наиболее распространенная форма отложенных итераций lazy iterables).

Если вы можете циклически пройти несколько раз, не «исчерпывая» его, это не итератор. Если вы не можете передать что-то функции next, это не итератор. Объект range Python 3 не является итератором. Если вы учите людей объектам range, не используйте слово «итератор». Это сбивает с толку и может привести к тому, что другие тоже начнут неправильно использовать слово «итератор».

С другой стороны, если вы видите, что кто-то другой неправильно использует слово итератор, не принимайте это близко к сердцу. Вы можете указать на неправильное использование, только если это будет казаться важным, но имейте в виду, что я слышал, что даже опытные программисты Python и преподаватели Python злоупотребляли этим словом, называя итераторами range объекты. Слова важны, но язык еще сложнее.

Спасибо, что присоединились ко мне в этом краткой заметке о range и наполненном итераторами приключении!

Оригинал:Python: range is not an iterator!

Была ли вам полезна эта статья?

[3 / 5]


Python xrange () vs range () объяснены на примерах

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

Python xrange () против диапазона ()

Что такое функции Python range и xrange?

В Python 2.x у нас были два основных метода для генерации списка целых чисел в заданном диапазоне.

Однако в Python 3 функция range () была выведена из эксплуатации, а функция xrange () переименована в range ().

Следовательно, в Python 3 мы получаем единственную функцию, которая могла бы производить числа из заданного диапазона. Это была не что иное, как функция Python range .

Функция range () в python 3.x — это просто повторная реализация xrange () в python 2.x. На самом деле он работает так же, как xrange.

Если вы используете Python 2.x, то для вас имеет значение только разница между xrange () и range ().

Разница между Python xrange и диапазоном

Две функции диапазона имеют много разных характеристик. Это может относиться к производительности, потреблению памяти, скорости и внутренней конструкции. Каждый из них имеет свою реализацию по-разному. Теперь давайте рассмотрим каждое такое различие одно за другим.

Эксплуатационная разница

В большинстве случаев xrange и range работают точно так же. Оба они позволяют составить список чисел, который вы будете использовать.

Таким образом, можно сказать, что оба они похожи по функциональности.Давайте теперь посмотрим на несколько примеров:

Диапазон выражения (1, 7, 2) будет производить [1, 3, 5], а xrange (1, 7, 2) произведет [1, 3, 5]. Следовательно, вы можете сделать вывод, что у них схожая схема выполнения и вывод.

Возвращаемые значения и тип

Это основной источник различий между функциями Python xrange и range.

Range () возвращает объект типа списка. Например, диапазон выражения (1, 100, 1) приведет к диапазону 99 чисел типа int. Он получает все числа за один раз.

 >>> r = диапазон (1, 100, 1)
>>> тип (r)
<тип 'список'>
>>> len (r)
99 

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

Объект xrange допускает итерацию, индексацию и метод len (). У вас может быть цикл for для его обхода и получения чисел на каждой итерации.

 >>> xr = xrange (1, 100, 1)
>>> тип (xr)
<введите 'xrange'>
>>> xr [0]
1
>>> для этого в xr:
... распечатать (это)
...
1
2
3
...
99 

Python xrange vs. range — сравните скорость

У нас есть модуль timeit в Python, чтобы фиксировать время выполнения любой функции. Мы будем использовать его в нашем тесте и посмотрим, какой из xrange или range быстрее.

Рассчитать время диапазона ()

Мы выполнили range () в нашем тесте три раза, см. Пример ниже и время, необходимое для выполнения:

 >>> время импорта
>>> timeit.timeit ('"-". join (str (num) for num in range (10000))', number = 10000)
22.56510010000011
>>> timeit.timeit ('"-". join (str (num) for num in range (10000))', number = 10000)
22.796818399999893
>>> timeit.timeit ('"-". join (str (num) for num in range (10000))', number = 10000)
24.003325399999994 

И снова мы трижды провели один и тот же тест с xrange () и записали время их выполнения.

 >>> timeit.timeit ('"-". Join (str (num) for num in xrange (10000))', number = 10000)
20.672853799999984
>>> timeit.timeit ('"-". join (str (num) for num in xrange (10000))', number = 10000)
20.471903500000053
>>> timeit.timeit ('"-". join (str (num) for num in xrange (10000))', number = 10000)
20.15995029999999 

Из приведенных выше тестов и результатов вы можете оценить, что xrange работает быстрее, чем стандартная функция диапазона.

  • При использовании xrange вы могли заметить, что он не создает статический список, как функция range (). Вместо этого он больше похож на генератор, который выдает значения по запросу.Этот метод широко известен как уступка.
  • Функция range () получает все числа сразу перед выполнением любой инструкции в цикле.

Вот несколько фактов для справки:

  • Основная проблема стандартной функции range () заключается в том, что она потребляет значительный объем памяти, особенно для большего диапазона чисел.
  • Функция xrange () всегда предоставляет следующий элемент по запросу. Это означает, что в памяти одновременно существует только один элемент.Следовательно, он потребляет меньше памяти.

Что предпочесть xrange или range?

Это компромисс между мгновенным результатом или сегментированным результатом. С xrange мы получаем более быстрый ответ; Кроме того, он потребляет меньше памяти.

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

Где мы должны использовать xrange ()?
  • Когда диапазон имеет более широкий диапазон, мы рекомендуем использовать xrange ().Это повысит скорость и потребует меньше памяти.
  • Если вы планируете работать на небольших устройствах (с ограничениями памяти), то с xrange () вы можете не увидеть проблем с буфером.
  • Поскольку xrange () оценивает элементы с зазором, вы можете сломаться в любой момент, когда это необходимо. Таким образом можно избежать создания всего списка.
Где мы должны использовать range ()?
  • Если вам нужно часто перемещаться по списку, лучше использовать range (). С xrange () создание экземпляра целочисленного объекта для каждого запроса индексации было бы накладными расходами.
  • Если вы не ищете широкий диапазон, то правильная идея — использовать функцию range ().
  • Поскольку метод диапазона возвращает объект списка, вы можете использовать все его функции. Напротив, xrange предоставляет чистый целочисленный объект, который требует индексации.
  • Интересно, что если вы хотите, чтобы ваш код Python 2.x был совместим с версией 3.x, то вам также следует предпочесть использование метода диапазона.

Python xrange в сравнении с совместимостью диапазонов

В Python 3.x, функция xrange не существует, тогда как она предоставляет функцию range (). На самом деле название «xrange» было изменено на «range» в Python 3.x.

Итак, если вы вызовете xrange () в Python 3.x, это вызовет ошибку, указанную ниже.

NameError: имя «xrange» не определено

Кроме того, если вы решите импортировать xrange, даже тогда произойдет следующая ошибка.

ImportError: Нет модуля с именем «xrange»

Следовательно, вы можете решить использовать range () вместо xrange () для обеспечения совместимости между разными версиями.

.

Как использовать функции Python range и xrange с 5 примерами

Назначение функции диапазона в Python

Диапазон — это встроенная функция в Python, представляющая неизменяемую последовательность чисел. Как правило, диапазон Python используется в цикле for для повторения блока кода заданное количество раз.

Например, вы можете создать диапазон из пяти чисел и использовать цикл for для повторения данного кода пять раз.

  • По умолчанию диапазон начинается с 0 с шагом 1. Таким образом, в случае диапазона 5 он будет начинаться с 0 и заканчиваться на 4.
  • Вы также можете указать начало и конец чисел, например начиная с 5 и заканчивая 9. Вы также можете указать шаг вместо 1.

Все это показано в примерах в разделе после синтаксиса использования диапазона в Python.

PS: Чтобы узнать о функции xrange и разнице между диапазоном и xrange, перейдите к последней части этого руководства.

Синтаксис функции диапазона

Общий синтаксис создания диапазона:

диапазон ([пуск], останов, [шаг])

  • Где стоп — обязательный параметр.
  • Начало указывает, где начать диапазон, например 5. Значение по умолчанию — 0.
  • Шаг определяет шаг между каждым числом. По умолчанию 1.

См. Следующие примеры создания простого диапазона и использования различных параметров.Я также покажу, как можно использовать функцию Python range с циклом for.

Пример создания простого диапазона

В этом примере создается диапазон из 5 номеров. Дан только параметр остановки, а шаг и остановка не указаны. Функция печати используется для отображения диапазона:

См. Онлайн-демонстрацию и код

Вот как создается и отображается диапазон:

tst_range = диапазон (10)

печать (tst_range)


Использование цикла for для отображения номеров диапазонов

На этот раз используется цикл for, в котором задан диапазон из десяти чисел.На каждой итерации отображаются номера диапазонов.

См. Онлайн-демонстрацию и код

В примере используется следующий код:

для x в диапазоне (10):

печать (x)


На выходе отображались числа от 0 до 9, с шагом 1, поэтому параметры запуска и шага не заданы.

Пример диапазона с начальным параметром

В этой демонстрации начальный номер дается в функции диапазона Python. Диапазон из десяти чисел, начинающийся с 20, создается и отображается с помощью цикла for, как показано ниже:

См. Онлайн-демонстрацию и код

Так создается диапазон:

диапазон (20,30)

Это означает, что диапазон начинается с 20 и заканчивается на 29. Таким образом, шаг не указывается, поэтому результат будет с разрывом в единицу:

для x в диапазоне (20,30):

print («Текущий элемент диапазона:», x)


Демонстрация указания номеров начала, конца и шага в функции диапазона

На этот раз в цикле for указан диапазон со всеми тремя числами:

диапазон (10,100,10)

Указывает на начало диапазона от 10 до конца на 100 с шагом , равным 10.Посмотрите код и результат на демонстрационной странице, щелкнув ссылки ниже:

См. Онлайн-демонстрацию и код

Следующий цикл for используется с функцией диапазона:

для x в диапазоне (10,100,10):

print («Текущий элемент диапазона:», x)


Это дало результат как:

Текущий элемент диапазона: 10

Текущий элемент диапазона: 20

Текущий элемент диапазона: 30

Текущий элемент диапазона: 40

Текущий элемент диапазона: 50

Текущий элемент диапазона: 60

Текущий элемент диапазона: 70

Текущий элемент диапазона: 80

Текущий элемент диапазона: 90

Пример отрицательного диапазона

В следующем примере показано, как можно создать список с отрицательными числами с помощью функции диапазона:

См. Онлайн-демонстрацию и код

Выполняется этот код:


Функция xrange в Python

Примечание. Python xrange был переименован в функцию диапазона из версии 3.х Python. В то время как функция диапазона в Python 2.x удалена.

Если вы использовали xrange в предыдущих версиях Python (2.x), переименуйте его вручную или альтернативно, вы можете использовать эту автоматизированную программу из Python, чтобы сделать ее совместимой с версией 3.x.

Разница

Единственное различие между двумя функциями было (в предыдущей версии), функция диапазона использовалась для возврата списка, в то время как функция xrange возвращала «объект xrange».

.Диапазон

в Python | Примеры функций диапазона в Python

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

Что такое диапазон в Python?

Это встроенная функция в Python, которая возвращает последовательность чисел, начиная с 0, и увеличивается до 1, пока не достигнет заданного числа.Чаще всего функция диапазона используется для перебора типа последовательности. Чаще всего используется в циклах for и while.

Параметры диапазона

Ниже приведены параметры функции диапазона, которые мы используем в python:

  • Start — это начальный параметр, он определяет начало последовательности чисел в функции диапазона.
  • Стоп — это конечная точка последовательности, число остановится, как только достигнет параметра остановки.
  • Шаг — Шаги или количество приращений перед каждым числом в последовательности определяется параметром шага.
диапазон (старт, стоп, шаг)
 

Диапазон с циклом For

Ниже приведен пример того, как мы можем использовать функцию диапазона в цикле for. Эта программа напечатает четные числа от 2 до 20.

для i в диапазоне (2,20,2):
     печать (я)
 
  Выход:  2
        4
        6
        8
        10
        12
        14
        16
        18 

Увеличение с положительным и отрицательным шагом

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

для i в диапазоне (2, 20, 5):
     print (i, end = ",")
для j в диапазоне (25, 0, -5):
     print (j, end = ",")
 
  Вывод:  2, 7, 12, 17, 25, 20, 15, 10, 5 

Числа с плавающей запятой в диапазоне

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

def frange (старт, стоп, шаг):
     я = начало
     пока я <стоп:
             дать я
             я + = шаг

для i во французском (0,6; 1,0; 0,1):
     print (i, end = ",")
 
  Вывод:  0,6, 0,7, 0,8, 0,9 

Обратный диапазон в Python

Следующая программа показывает, как мы можем изменить диапазон в Python. Он вернет список из первых 5 натуральных чисел в обратном порядке.

для i в диапазоне (5, 0, -1):
    print (i, end = ",")
 
  Вывод:  5, 4, 3, 2, 1, 0 

Диапазон против XRange

  • Основное различие между диапазоном и xrange состоит в том, что диапазон возвращает объект списка Python, а xrange возвращает объект xrange.
  • По большей части, range и xrange в основном выполняют одни и те же функции, предоставляя последовательность чисел в порядке, который нравится пользователю.
  • xrange не создает статический список, как диапазон во время выполнения. Он использует особую технику, известную как уступка, для создания значений, которые нам нужны, этот метод используется объектом, известным как генераторы.
  • Если вам нужно повторить последовательность несколько раз, лучше использовать диапазон вместо xrange.
  • В python 3 xrange больше не существует, поэтому лучше использовать вместо него range.В любом случае мы можем использовать инструмент 2to3, который предоставляет python, для преобразования вашего кода.

Объединение двух функций диапазона

В приведенной ниже программе выполняется объединение двух функций диапазона.

из цепочки импорта itertools

res = цепочка (диапазон (10), диапазон (10, 15))
для я в разрешении:
    print (i, end = ",")
 
  Выход:  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 

Доступ к диапазону с использованием значений индекса

Следующая программа показывает как мы можем получить доступ к диапазону с помощью индексов.

a = диапазон (0,10) [3]
b = диапазон (0,10) [5]
печать (а)
печать (б)
 
  Выход:  3
        5 

Преобразование диапазона в список

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

a = диапазон (0,10)
b = список (а)
c = список (диапазон (0,5))
печать (б)
печать (с)
 
  Вывод:  [0,1,2,3,4,5,6,7,8,9]
        [0,1,2,3,4] 

Очки для запоминания

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

На этом мы подошли к концу этой статьи, где мы узнали, как мы можем использовать диапазон в Python, с несколькими примерами, включая цикл for в Python и разницу между диапазоном и xrange в Python.Я надеюсь, что вы понимаете все, что было поделено с вами в этом руководстве.

Если вы нашли эту статью о «Range In Python» релевантной, посетите Edureka Python Certification Training, надежную компанию по онлайн-обучению с сетью из более чем 250 000 довольных учеников по всему миру.

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

Если у вас возникнут какие-либо вопросы, не стесняйтесь задавать все свои вопросы в разделе комментариев «Range In Python», и наша команда будет рада ответить.

.Диапазон

против xrange в Python

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

диапазон и xrange

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

примеров / python / range_3_7.py

#! / usr / bin / env python
from __future__ import print_function

для v в диапазоне (3, 7):
    печать (v)
 

От первого числа (3) до единицы перед вторым числом (7):

3
4
5
6
 

примеров / python / range_5.ру

#! / usr / bin / env python
from __future__ import print_function

для v в диапазоне (5):
    печать (v)
 

Если есть только один номер, это будет конечный номер и начальный номер по умолчанию. будет 0. Таким образом, диапазон (5) совпадает с диапазоном (0, 5)

0
1
2
3
4
 

примеров / python / range_step.py

#! / usr / bin / env python
from __future__ import print_function

для v в диапазоне (0, 5, 2):
    печать (v)
 

Если есть 3 параметра, первый из них - 3 значения, становится «шагом» по умолчанию. в 1, если 3-й параметр отсутствует.Результат будет следующий:

0
2
4
 

Переменная, удерживающая диапазон

Что, если мы хотим создать переменную, которая будет содержать диапазон? Мы можем это сделать, и это довольно просто с любым диапазоном или xrange

r = диапазон (1000)
 

Затем мы можем пройтись по элементам:

для v в r:
    проходить
 

или мы можем получить к ним доступ по индексу:

печать (r [4])
 

Размер памяти

Большая разница в объеме используемой памяти:

примеров / python / range-memory.ру

#! / usr / bin / env python
from __future__ import print_function
import sys

r = диапазон (10000)
печать (sys.getsizeof (r)) # 80072

х = х диапазон (10000)
печать (sys.getsizeof (x)) # 40
 

Переменная, содержащая диапазон, созданный диапазоном, использует 80072 байта. в то время как переменная, созданная xrange, использует только 40 байтов.

Причина в том, что диапазон создает список, содержащий все значения, а xrange создает объект, который может перебирать числа по запросу.

примеров / python / range-type.ру

#! / usr / bin / env python
from __future__ import print_function
import sys

r = диапазон (10000)
х = х диапазон (10000)
print (type (r)) # 
print (type (x)) # 
 

Speed ​​- Диапазон сравнительного анализа и xrange

«Стоимость» экономии памяти заключается в том, что поиск индексов в xrange займет немного больше времени. Этот тестовый код, который использует timeit модуль показывает, что версия xrange на 10% медленнее:

примеров / python / range-benchmark.ру

#! / usr / bin / env python
from __future__ import print_function
время импорта

r = диапазон (10000)
х = х диапазон (10000)

def range_index ():
    z = r [9999]

def range_xindex ():
    z = x [9999]

если __name__ == '__main__':
    время импорта
    print (timeit.timeit ("range_index ()", setup = "from __main__ import range_index", number = 10000000))
    print (timeit.timeit ("range_xindex ()", setup = "from __main__ import range_xindex", number = 10000000))
 

В результате получаются следующие числа:

2.16770005226
2,35304307938
 
.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *