4

我正在使用 python-3.2.3 64bit 并且我看到一些奇怪的行为。

例如使用解释器时:输入

>>> range(10)

结果输出

range(0, 10)

什么时候应该打印

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

类似输入

>>> l = range(10)
>>> f = filter( lambda x: x<2, l)
>>> f

导致输出

<filter object at 0x00000000033481D0>

但应该是

[0, 1]

显然我不能对那个对象做任何事情:

>>>> len(f)
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    len(f)
TypeError: object of type 'filter' has no len()

这里有什么问题?

4

2 回答 2

18

没有什么是错的。range()是 Py3.x 像生成器一样一次生成项目 1 ,这与 Py2.x 中的行为不同,它是立即生成一个列表,然后将其返回给您。将您的呼叫包裹在range(10)呼叫中list(),您将得到您所期望的。

于 2012-06-07T18:55:25.317 回答
3

这些函数返回迭代器对象。list(range(0, 10))您可以使用或将它们转换为列表list(f)。您还可以遍历结果,例如:

for i in range(0, 10):
    print(i)

最后,您可以使用next函数获取下一项:

l = range(0, 10)
l1 = next(l)
l2 = next(l)

返回迭代器而不是列表允许对项目执行复杂的操作,而无需将所有项目加载到内存中。例如,您可以遍历一个巨大的文件并逐个字符地对其进行转换,而无需将整个文件加载到内存中。

于 2012-06-07T18:57:49.500 回答