Python3中的过滤器

use*_*882 106 python list filter python-3.x

我正在学习Python中的过滤器概念.我正在运行这样一个简单的代码.

>>> def f(x): return x % 2 != 0 and x % 3 != 0
>>> filter(f, range(2, 25))
Run Code Online (Sandbox Code Playgroud)

但是我没有得到一个列表,而是得到了这样的消息.

<filter object at 0x00FDC550>
Run Code Online (Sandbox Code Playgroud)

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

mgi*_*son 174

看起来你正在使用python 3.x. 在python3, ,filter,map,zip等返回一个对象,它是可迭代的,但不是列表.换一种说法,

filter(func,data) #python 2.x
Run Code Online (Sandbox Code Playgroud)

相当于:

list(filter(func,data)) #python 3.x
Run Code Online (Sandbox Code Playgroud)

我认为它已被更改,因为您(通常)想要在惰性意义上进行过滤 - 您不需要消耗所有内存来预先创建列表,只要迭代器返回相同的列表即可会在迭代期间.

如果您熟悉列表推导和生成器表达式,则上面的过滤器现在(几乎)等效于python3.x中的以下过滤器:

( x for x in data if func(x) ) 
Run Code Online (Sandbox Code Playgroud)

相反:

[ x for x in data if func(x) ]
Run Code Online (Sandbox Code Playgroud)

在python 2.x中

  • 这是对象的ID.在CPython中,它是内存位置. (5认同)
  • 哇...有趣...我认为 [] snd list() 是等价的,但 [filter(func, data)] 不一样 (2认同)
  • @Mr_and_Mrs_D尝试在[]中放置一个迭代器对象itObj,你将得到[itObj],而放入list(),你会得到像[1,4,7]这样的对象的值,假设itObj有这些值. (2认同)

slo*_*oth 21

它是过滤器函数返回的迭代.

如果你想要一个清单,就行了

list(filter(f, range(2, 25)))
Run Code Online (Sandbox Code Playgroud)

尽管如此,您可以使用循环遍历此对象for.

for e in filter(f, range(2, 25)):
    do_stuff(e)
Run Code Online (Sandbox Code Playgroud)