Range () действительно создает списки?
13125 просмотра
3 ответа
И мой профессор, и этот парень утверждают, что range
создают список ценностей.
«Примечание: функция range просто возвращает список, содержащий числа от x до y-1. Например, range (5, 10) возвращает список [5, 6, 7, 8, 9].»
Я считаю, что это должно быть неточно, потому что:
type(range(5, 10))
<class 'range'>
Кроме того, единственный очевидный способ получить доступ к целым числам, созданным с помощью, range
- это перебрать их, что заставляет меня полагать, что маркировка range
списками является неправильной.
Ответы (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
.
Преимущество xrange
over range
в Python 2.x:
Преимущество
xrange()
overrange()
минимально (поскольку по-xrange()
прежнему приходится создавать значения по запросу), за исключением случаев, когда очень большой диапазон используется на машине с нехваткой памяти или когда все элементы диапазона никогда не используются (например, когда цикл обычно заканчивается перерывом).
Примечание:
Кроме того, единственный очевидный способ получить доступ к целым числам, созданным с помощью,
range()
- это перебрать их,
Нет. Поскольку range
объекты в Python 3 являются неизменяемыми последовательностями, они также поддерживают индексацию. Цитирование из range
документации по функции,
Диапазоны реализуют все общие операции последовательности, кроме конкатенации и повторения
...
Объекты Range реализуют
collections.abc.Sequence
ABC и предоставляют такие функции, как тесты на содержание, поиск индекса элемента , нарезку и поддержку отрицательных индексов.
Например,
>>> 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. Но он будет работать бесконечно. Вы можете объяснить, почему?
Решение
Автор: thefourtheye Размещён: 22.04.2014 01:28Потому что
range
возвращает неизменяемую последовательность , а не объект итератора. Таким образом, всякий раз, когдаislice
выполняетсяrange
объект, он всегда начинается с самого начала. Думайте об этом как о замене неизменного списка. Теперь возникает вопрос, как вы это исправите? Это просто, вам просто нужно извлечь из этого итератор. Просто измените
numbers = range(100)
на
numbers = iter(range(100))
Сейчас,numbers
это объект итератора, и он запоминает, как долго он итерировался раньше. Таким образом, когдаislice
он повторяется, он просто начинается с того места, где он ранее заканчивался.
7 плюса
По-разному.
В python-2.x range
фактически создает список (который также является последовательностью), тогда как xrange
создает xrange
объект, который можно использовать для перебора значений.
С другой стороны, в python-3.x range
создается итеративная (или, более конкретно, последовательность)
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Вопросы из категории :
- python Обработка XML в Python
- python Как я могу использовать Python itertools.groupby ()?
- python Python: На какой ОС я работаю?
- python Как я могу создать непосредственно исполняемое кроссплатформенное приложение с графическим интерфейсом на Python?
- python Вызов функции модуля с использованием его имени (строки)
- python Звук Питона («Колокол»)
- python Regex и unicode
- python Создать зашифрованный ZIP-файл в Python
- python Создайте базовый итератор Python
- python Функция транспонирования / распаковки (обратная сторона zip)?
- range В чем разница между функциями range и xrange в Python 2.X?
- range Лучший способ извлечь подвектор из вектора?
- range Как использовать десятичное значение шага ()?
- range Числовой диапазон итераторов в бусте?
- range Как узнать, принадлежит ли число к определенному диапазону в Python?
- range Можно ли реализовать Python для цикла диапазона без переменной итератора?
- range Как создать диапазон с шагом n в bash? (сгенерировать последовательность чисел с приращениями)
- range Диапазон лет в JavaScript для поля выбора
- range Как работает функция диапазона Python?
- range Vim yanking диапазон линий