为什么Range函数的输出不是一个列表?



根据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, reducefilter,在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每次计算并返回一个元素。这就是为什么当我们打印一个范围对象时,我们实际上看不到范围的内容,因为它们还不存在!

最新更新