根据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'>
我在网上的任何一个例子中都没有看到这一点,并且非常感谢有关这方面的一些亮点。
答案 0 :(得分:14)
那是因为range
和其他功能样式的方法,例如map
,reduce
和filter
,在Python 3中返回迭代器。在Python 2中,它们返回了列表
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 一次计算并返回一个元素。这就是为什么当我们打印一个范围对象时,我们实际上并没有看到范围的内容,因为它们还不存在!