Python:解释器返回对象/函数,而不是计算

Python:解释器返回对象/函数,而不是计算,python,Python,我正在使用python-3.2.3 64位,我看到一些奇怪的行为 例如,在使用解释器时: 输入 >>> 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 显然,我不能用那个东西做任何事: >>

我正在使用python-3.2.3 64位,我看到一些奇怪的行为

例如,在使用解释器时: 输入

>>> 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
显然,我不能用那个东西做任何事:

>>>> len(f)
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    len(f)
TypeError: object of type 'filter' has no len()
>>>len(f)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
len(f)
TypeError:类型为“filter”的对象没有len()

这里怎么了?

没什么不对的
range()
is Py3.x会像生成器一样一次生成项目1,这与Py2.x中的行为不同,Py2.x中的行为是立即生成列表,然后返回给您。将对
range(10)
的调用包装在对
list()
的调用中,您将得到预期的结果。

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

for i in range(0, 10):
    print(i)
最后,您可以使用
next
函数获取下一项:

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

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

同样适用于过滤器。因此,我认为
f
仍然可用,只要你遍历它,并且不希望它像列表一样。好吧,我显然读错了文档,尴尬。很抱歉,谢谢你指出这一点。现在一切都清楚了。
for i in range(0, 10):
    print(i)
l = range(0, 10)
l1 = next(l)
l2 = next(l)