根据Python文档,当我执行range(0,10)时,该函数的输出是一个从0到9的列表,即[0,1,2,3,4,5,6,7,8,9]。然而,我PC上的Python安装并没有输出这个,尽管有许多在线工作的例子。
这是我的测试代码…
test_range_function = range(0, 10)
print(test_range_function)
print(type(test_range_function))
我认为这个的输出应该是打印的列表,并且类型函数应该将其输出为列表。相反,我得到以下输出…
c:Programming>python range.py
range(0, 10)
<class 'range'>
我在网上的任何例子中都没有看到这一点,我真的希望能有一些关于这一点的启示。
这是因为range
和其他函数式方法,如map
, reduce
和filter
,在Python 3中返回迭代器。在Python 2中,它们返回列表。
Python 3.0的新特性:
range()
现在表现得像xrange()
过去的行为,除了它与任意大小的值。后者已不复存在。
要将迭代器转换为列表,可以使用list
函数:
>>> list(range(5)) #you can use list()
[0, 1, 2, 3, 4]
通常你不需要将一个范围具体化到一个实际的列表中,而只是想迭代它。因此,对于较大的范围,使用迭代器可以节省内存。
因此,Python 3中的range()
返回一个迭代器(就像Python 2中的xrange()
一样)。如果出于某种原因你想要一个实际的列表,请使用list(range(..))
。
range()不返回迭代器,它不是迭代器,而是可迭代的。迭代器协议有2个方法。__iter__
和__next__
r=range(10)
'__ iter __' in dir(r) # True
`__ next __` in dir(r) # False
可迭代协议要求__iter__
返回一个迭代器。
r.__iter__()
# <range_iterator object at 0x7fae5865e030>
range()使用延迟求值。这意味着它不会预先计算和存储range(10)
。它的迭代器range_iterator每次计算并返回一个元素。这就是为什么当我们打印一个范围对象时,我们实际上看不到范围的内容,因为它们还不存在!