我的教授和this guy都声称range
会创建一个值列表。
"注意:范围函数只返回包含数字的列表 从x到y-1。例如,range(5,10)返回列表[5,6,7,8, 9]"
我认为这是不准确的,因为:
type(range(5, 10))
<class 'range'>
此外,访问range
创建的整数的唯一明显方法是迭代它们,这使我相信将range
标记为列表不正确。
答案 0 :(得分: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
的不可变序列。
在Python 2.x中xrange
超过range
的优势:
xrange()
优于range()
的优势很小(因为xrange()
仍需要在被要求时创建值),除非在内存饥饿时使用非常大的范围机器或从不使用所有范围的元素时(例如循环通常以中断终止)。
注意:强>
此外,访问
range()
创建的整数的唯一明显方法是迭代它们,
不。由于Python 3中的range
对象是不可变序列,因此它们也支持索引。引自range
功能文档,
Ranges实现除串联和重复之外的所有常见序列操作
...
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)
人们会期望这段代码每隔10个数字打印一次,直到99.但是,它会无限运行。你能说出理由吗?
<强>解决方案强>
因为
range
返回不可变的序列,而不是迭代器对象。因此,只要在islice
对象上完成range
,它就始终从头开始。可以将其视为不可变列表的替代品。现在问题来了,你将如何解决它?它很简单,你只需要从它得到一个迭代器。只需改变
numbers = range(100)
到
numbers = iter(range(100))
现在,numbers
是一个迭代器对象,它记住以前迭代了多长时间。因此,当islice
迭代它时,它只是从它之前结束的地方开始。
答案 1 :(得分:7)
取决于。
在python-2.x中,range
实际上创建了一个列表(也是一个序列),而xrange
创建了一个xrange
对象,可用于迭代值。
另一方面,在python-3.x中,range
创建了一个可迭代的(或更具体地,一个序列)
答案 2 :(得分:1)
范围会创建一个列表。 在这种情况下,只有在多次引用时才使用范围,否则使用xrange,通过重新使用内存使用量来创建一个生成器,有时候因为它具有惰性方法。
xrange不在python 3.x中而是range代表xrange对于python 2.x
参考问题 What is the difference between range and xrange functions in Python 2.X?
答案 3 :(得分:-1)
var = list(range(start, end+1)