编程学习网 > 编程语言 > Python > 使用Python内置的filter()方法来过滤?
2025
07-18

使用Python内置的filter()方法来过滤?


要说Python里的filter()函数啊,很多初学者一开始都觉得这玩意儿挺神秘,其实真没那么高深。讲人话,它就是个“筛选器”,你给它一堆数据,再告诉它一套规则,它就帮你把符合规则的留下来,不符合的扔掉。

我最早接触filter()还是在公司做数据清洗那会儿,要从一堆日志里挑出成功的请求,那时候还没上什么Pandas,全靠原生Python凑合。说实话,那时候一看filter()这名字我就以为它是个高级API,直到用上之后才发现,它其实就是个简化的for循环加if判断。

用法特简单,filter(函数, 可迭代对象),第一个参数是一个返回布尔值的函数,第二个就是你想过滤的列表、元组、集合啥的。比如说,咱想从一个列表里找出所有偶数,可以这么写:


很多人看到这里就开始偷笑:“不就一个lambda嘛,跟for循环一样啊。”但我跟你说,真正的牛逼在于它这叫“惰性计算”。什么意思?就是说它不会一下子处理完全部数据,而是一个一个慢慢处理。这在你处理几十万、上百万条数据时,能省不少内存。你写个for + if当然也能实现逻辑,但内存占用就不是一个量级的事儿了。

还有一点我得吐槽一下,有些人觉得filter()和map()必须一起用才“高级”。拜托,这种思维太“Python鄙视链”了。明明filter()可以自己单干,非要和map()绑在一块,有种“非得加点装饰才显得有深度”的感觉。

说到这,我突然想起一次线上事故。当时我们团队要在日志系统里筛一批特定ID的请求记录,我一个实习小兄弟为了“展示技巧”,硬是写了个filter(lambda x: x.startswith("REQ_") and x.endswith("_OK"), log_list),听着好像很牛,其实你仔细一看,这种场景更适合用列表推导式。不仅代码更简洁,而且可读性也高。

就像下面这样:


有时候你非要显摆filter(),结果把代码搞得跟谜语一样,真不如直接用最直白的方式。

当然话又说回来,filter()在一些特定场景下,确实挺好用。比如你要处理一个迭代器流,数据量特别大,比如日志流、传感器数据、或者从数据库里分页拉取的数据,这时候你要逐条处理、逐条筛选,那filter()配合生成器真是香到不行。

举个例子,我们公司有个IoT项目,要处理每秒上万条设备上传的数据,先用生成器按页拉,再用filter()把不合格的数据先干掉,结果内存占用直接从几百M掉到几十M,性能也嗖嗖地上去了。


这种组合拳,说实话,放在老式Java或者C里写,得折腾半天。Python这点是真的“拿来即用”。

不过我也得提醒一句,filter()虽然好用,但别盲目用。有时候我们为了一行代码写得“精致”,结果团队的小伙伴一看全是lambda+filter+map+reduce,看得一脸懵逼。咱们做开发的,归根到底是要写团队能读懂、能维护的代码,不是给自己刷“代码优雅分”。

那到底啥时候该用filter()呢?我一般的原则是这样:

  1. 处理数据流,不想一次性加载全部数据,用filter() + 生成器走起来。
  2. 筛选逻辑比较独立且简洁,比如判断是不是正数、是否非空等等。
  3. 不需要额外的上下文环境,filter配lambda一气呵成。

反过来,如果你的判断逻辑很复杂,还得处理多个字段甚至外部变量,那建议别用filter(),用for循环或者函数提取,结构清晰还好调试。

另外还有一个常见误解,就是有人觉得filter()返回的是列表。其实不然,它返回的是个filter对象,也就是迭代器。你要是真想拿到结果,得list()包一下。像下面这样:


这里还藏着个小技巧——用filter(None, data)可以把所有“假值”都过滤掉,包括空字符串、None、0、False。是不是挺有意思?这种Python里经典的“懒人写法”,其实在业务里偶尔用用还是挺舒服的。

写到这,我又想起当年刚转Python的时候,天天琢磨怎么写出“pythonic”的代码。后来我发现,最“pythonic”的代码就是你写得自己舒服、别人也能看懂,不用死磕语法糖,也不用强行写得像黑魔法。filter()这个函数就是这么个东西,用得好是神器,用不好就是花里胡哨。

所以啊兄弟们,别再问什么“filter是不是高级特性”了。它就像咱们厨房的滤网,用好了能捞精华,用不好就跟没用一样。关键在于你是不是清楚自己要留下什么、扔掉什么。

最后我留个思考题:如果你现在要处理一个几百万级的订单数据列表,只保留最近30天内状态为“已支付”的订单,你是会用filter写一个lambda,还是老老实实用for循环判断?反正我是看场景决定,真别为了优雅写出让人看不懂的代码。你说呢?

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取