在Python3中的filter

我正在学习Python中的filter的概念。 我正在运行一个这样的简单的代码。

>>> def f(x): return x % 2 != 0 and x % 3 != 0 >>> filter(f, range(2, 25)) 

但是,我没有得到一个清单,我收到了这样的消息。

 <filter object at 0x00FDC550> 

这是什么意思? 这是否意味着我的过滤对象,即列表出来是存储在该内存位置? 我如何获得我需要的清单?

它看起来像你使用Python 3.x. 在python3, filtermapzip等返回一个对象是可迭代的,但不是一个列表。 换一种说法,

 filter(func,data) #python 2.x 

相当于:

 list(filter(func,data)) #python 3.x 

我认为它被改变是因为你(经常)想要在懒惰的意义上进行过滤 – 只要迭代器返回一个列表,就不需要消耗所有的内存来创build列表会在迭代期间。

如果您熟悉列表parsing和生成器expression式,上面的filter现在(几乎)等同于python3.x中的以下内容:

 ( x for x in data if func(x) ) 

而不是:

 [ x for x in data if func(x) ] 

在python 2.x

这是一个由filter函数返回的迭代 器 。

如果你想要一个列表,只需要做

 list(filter(f, range(2, 25))) 

尽pipe如此,你可以用for循环迭代这个对象。

 for e in filter(f, range(2, 25)): do_stuff(e)