Range () действительно создает списки?

python range

13125 просмотра

3 ответа

И мой профессор, и этот парень утверждают, что rangeсоздают список ценностей.

«Примечание: функция range просто возвращает список, содержащий числа от x до y-1. Например, range (5, 10) возвращает список [5, 6, 7, 8, 9].»

Я считаю, что это должно быть неточно, потому что:

type(range(5, 10))
<class 'range'>

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

Автор: chopper draw lion4 Источник Размещён: 12.11.2019 09:14

Ответы (3)


102 плюса

Решение

В Python 2.x rangeвозвращает список, но в Python 3.x rangeвозвращает неизменную последовательность типа range.

Python 2.x:

>>> type(range(10))
<type 'list'>
>>> type(xrange(10))
<type 'xrange'>

Python 3.x:

>>> type(range(10))
<class 'range'>

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

Преимущество xrangeover rangeв Python 2.x:

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

Примечание:

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

Нет. Поскольку rangeобъекты в Python 3 являются неизменяемыми последовательностями, они также поддерживают индексацию. Цитирование из rangeдокументации по функции,

Диапазоны реализуют все общие операции последовательности, кроме конкатенации и повторения

...

Объекты Range реализуют collections.abc.SequenceABC и предоставляют такие функции, как тесты на содержание, поиск индекса элемента , нарезку и поддержку отрицательных индексов.

Например,

>>> range(10, 20)[5]
15
>>> range(10, 20)[2:5]
range(12, 15)
>>> list(range(10, 20)[2:5])
[12, 13, 14]
>>> list(range(10, 20, 2))
[10, 12, 14, 16, 18]
>>> 18 in range(10, 20)
True
>>> 100 in range(10, 20)
False

Все это возможно с этой неизменной rangeпоследовательностью.


Недавно я столкнулся с проблемой, и я думаю, что было бы целесообразно включить сюда. Рассмотрим этот код Python 3.x

from itertools import islice
numbers = range(100)
items = list(islice(numbers, 10))
while items:
    items = list(islice(numbers, 10))
    print(items)

Можно было бы ожидать, что этот код будет печатать каждые десять чисел в виде списка, до 99. Но он будет работать бесконечно. Вы можете объяснить, почему?

Решение

Потому что rangeвозвращает неизменяемую последовательность , а не объект итератора. Таким образом, всякий раз, когда isliceвыполняется rangeобъект, он всегда начинается с самого начала. Думайте об этом как о замене неизменного списка. Теперь возникает вопрос, как вы это исправите? Это просто, вам просто нужно извлечь из этого итератор. Просто измените

numbers = range(100)

на

numbers = iter(range(100))

Сейчас, numbersэто объект итератора, и он запоминает, как долго он итерировался раньше. Таким образом, когда isliceон повторяется, он просто начинается с того места, где он ранее заканчивался.

Автор: thefourtheye Размещён: 22.04.2014 01:28

7 плюса

По-разному.

В python-2.x rangeфактически создает список (который также является последовательностью), тогда как xrangeсоздает xrangeобъект, который можно использовать для перебора значений.

С другой стороны, в python-3.x rangeсоздается итеративная (или, более конкретно, последовательность)

Автор: sshashank124 Размещён: 22.04.2014 01:28

1 плюс

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

xrange отсутствует в python 3.x, а range означает, что xrange для python 2.x

обратитесь к вопросу В чем разница между функциями range и xrange в Python 2.X?

Автор: Sarath Sadasivan Pillai Размещён: 28.04.2014 08:01
Вопросы из категории :
32x32