为什么我的范围函数的输出不是列表?

时间:2013-05-17 22:33:59

标签: python python-3.x

根据Python文档,当我执行范围(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'>

我在网上的任何一个例子中都没有看到这一点,并且非常感谢有关这方面的一些亮点。

3 个答案:

答案 0 :(得分:14)

那是因为range和其他功能样式的方法,例如mapreducefilter,在Python 3中返回迭代器。在Python 2中,它们返回了列表

What’s New In Python 3.0

  

range()现在表现得像xrange()一样,除了它可以使用   任意大小的值。后者不再存在。

要将迭代器转换为列表,您可以使用list函数:

>>> list(range(5)) #you can use list()
[0, 1, 2, 3, 4]

答案 1 :(得分:6)

通常,您不需要将范围具体化为实际列表,只是想迭代它。因此,特别是对于使用迭代器的较大范围可以节省内存。

因此,Python 3中的range()会返回一个迭代器(如Python 2中的xrange())。如果您出于某种原因需要实际列表,请使用list(range(..))

答案 2 :(得分:0)

range() 不返回迭代器,它不是迭代器,它是可迭代的。迭代器协议有两种方法。 __iter____next__

 r=range(10) 
  '__ iter __' in dir(r) # True
  `__ next __` in dir(r) # False

iterable 协议需要返回迭代器的 __iter__

r.__iter__()
# <range_iterator object at 0x7fae5865e030>

range() 使用惰性求值。这意味着它不会预先计算和存储 range(10)。它的迭代器 range_iterator 一次计算并返回一个元素。这就是为什么当我们打印一个范围对象时,我们实际上并没有看到范围的内容,因为它们还不存在!