在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, filter
, map
, zip
等返回一个对象是可迭代的,但不是一个列表。 换一种说法,
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)