我正在学习Python中过滤器的概念。我正在运行这样一个简单的代码。
>>> 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
我认为它之所以被更改,是因为你(经常)想在懒惰的意义上进行过滤——你不需要消耗所有的内存来预先创建一个列表,只要迭代器在迭代过程中返回与列表相同的东西。
如果您熟悉列表理解和生成器表达式,那么上面的过滤器现在(几乎)相当于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)))
尽管如此,您可以使用for
循环来迭代该对象。
for e in filter(f, range(2, 25)):
do_stuff(e)