2013-05-17 113 views
4

根据Python文档,当我做范围(0,10)时,此函数的输出是从0到9的列表,即[0,1,2,3,4,5,6,7,8,9 ]。但是,我的电脑上的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'> 

我没有任何的例子在网上看到了这一点,真的希望一些光在这所流下。

+9

您是否阅读过3.x版本的python doc?要获得一个列表,你必须做'list(range(0,10))'。 – 2013-05-17 22:34:59

+3

这是从2.x到3的变化,记录在这里:http://docs.python.org/3.0/whatsnew/3.0.html#views-and-iterators-instead-of-lists。无论如何,大多数情况下你最好用迭代器,但是arbauthc的评论显示如果你确实需要它,就创建列表。 –

+1

如果您正在查看[Python在线文档](http://docs.python.org/3/index.html),请务必阅读正在使用的版本的文档。在每个页面的左上角有一个小小的选项菜单,例如“2.7.5”,您可以更改为“3.3”。 – abarnert

回答

11

这是因为range和其他函数式方法(如map,reducefilter)在Python 3中返回迭代器。在Python 2中,它们返回列表。

What’s New In Python 3.0

range()现在的行为像用来表现xrange(),除了它具有任意大小的 价值的作品。后者不再存在。

要一个iterator转换到一个列表,你可以使用list功能:

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

通常不需要兑现的范围为实际的名单,但只是想遍历它。特别是对于使用迭代器的更大范围来说,可以节省内存

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

+6

+1,这解释了改变的原因以及改善的原因。一个细微的区别 - 在3.x中的'range()'返回一个可迭代的,而不是一个迭代器。它比直接迭代器有一些优点,比如它在循环时没有耗尽,并且它是一个序列,所以你可以对它进行切片等...'range(10)[:5] == range(0,5 )'。 –

+1

...并且它也实现了O(1)'__contains__'。所以当新手在范围(1,21,2)中写入5(像他们一样),它不再是一个错误,而是一个很好且完美的惯用代码。 – abarnert

相关问题