page contents

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

很多人学 Python 的时候,都会在某一章节碰到 filter() 这个函数。说实话,刚开始看这玩意儿,我跟你一样也是一头雾水——这不就是个 for 循环加个 if 判断的事情吗?整得这么抽象干啥?但后来用得多了,再看回 filter(),我得说:这玩意儿,是真香。

attachments-2025-06-Y6uCwQo6685df15203802.jpg很多人学 Python 的时候,都会在某一章节碰到 filter() 这个函数。说实话,刚开始看这玩意儿,我跟你一样也是一头雾水——这不就是个 for 循环加个 if 判断的事情吗?整得这么抽象干啥?但后来用得多了,再看回 filter(),我得说:这玩意儿,是真香。

咱们今天就聊聊 filter() 这玩意儿,讲清楚它是干啥的,为什么要用它,用好了到底能有多爽。当然,我不是来当官方文档翻译机的,咱说点人话,整点实战,毕竟纸上得来终觉浅,代码撸多了才会感叹:嗯,这是真有用。

filter() 是啥?它不就是个筛子嘛

你可以把 filter() 理解成一个装了筛网的水管,数据一股脑流进去,只有满足条件的才会被漏出来,其它的全被拦在外面。这不就跟咱们平时写的:

result = []

for i in some_list:

    if 条件(i):

        result.append(i)

没啥本质区别?对,就是这么回事,但问题来了:为啥要用 filter() 而不是 for 循环?我告诉你,因为优雅,因为表达力强,因为函数式编程让代码看起来就舒服!

来点例子,别光说不练

先来个最简单的,筛选出一个列表中所有的偶数:

nums = [1, 2, 3, 4, 5, 6]


def is_even(n):

    return n % 2 == 0


result = filter(is_even, nums)

print(list(result))  # [2, 4, 6]

你可能会说,这不就是加个函数名嘛,有啥大不了的?是,你说得没错。但你仔细体会下这种写法带来的那种“只管定义规则,执行交给系统”的感觉,特别爽。

再来一刀流版本(也就是匿名函数 lambda):

result = filter(lambda x: x % 2 == 0, nums)

一行搞定,不需要额外写函数定义,尤其适合那种“我就用这一次”的逻辑。

filter() 跟 map()、reduce()、list comprehension 是亲兄弟

这一家子可是 Python 函数式编程的顶梁柱。map() 负责“改造”,filter() 负责“筛选”,reduce() 负责“归并”,而列表推导式嘛,就是他们的混合体,适合喜欢语法糖的人。

不过说实话,Python3 之后很多人更爱用列表推导式来替代 filter():

# 用 filter

result = list(filter(lambda x: x > 3, [1, 2, 3, 4, 5]))


# 用列表推导式

result = [x for x in [1, 2, 3, 4, 5] if x > 3]

哪种好?我个人建议:简单场景用列表推导式,复杂逻辑还是用 filter() + 函数,清晰可读才是王道。

filter() 是惰性执行的,别被它骗了

这个点很多新手容易踩坑。filter() 返回的是一个迭代器,只有你去遍历它的时候,它才真的开始干活。这就意味着,如果你对这个返回值不上手,光在那里 print(result),你会看到:

<filter object at 0x000001E3F97A3A90>

一个地址?你耍我呢?不不不,这不是耍你,而是 Python 的“懒惰”,也就是惰性执行(lazy evaluation),这是提高性能的一种手段。你得这么用:

print(list(result))

或者配合 for 去跑,这才是正道。

filter() 的强大,其实在组合式玩法

你别看它只是个简单的过滤器,但如果你跟 map()、sorted()、any()、all() 搭配起来,那效果简直不要太香。

比如,我要从一堆用户字典中,找出所有未成年但注册了账号的用户,然后只输出他们的用户名:

users = [

    {'name': 'Alice', 'age': 17, 'active': True},

    {'name': 'Bob', 'age': 20, 'active': False},

    {'name': 'Charlie', 'age': 15, 'active': True},

    {'name': 'David', 'age': 22, 'active': True},

]


result = list(

    map(

        lambda user: user['name'],

        filter(lambda u: u['age'] < 18 and u['active'], users)

    )

)

# ['Alice', 'Charlie']

这一波组合拳打得漂亮,逻辑清晰,代码紧凑,读起来一目了然,连测试小姐姐都夸“你这写法好懂啊”!

filter() 不是万能的,但它能让代码更优雅

我不会忽悠你说 filter() 是银弹,有了它啥都能搞定,毕竟很多复杂场景还是得靠更灵活的手写逻辑。但在那些纯粹的“筛选”场景下,它确实能让代码更精炼、更容易维护。

你看一些老司机的项目代码,filter()/map()/reduce() 用得飞起,尤其是在数据清洗、日志处理、ETL 任务里,写起来比 for 循环清爽太多。甚至还有人把 filter() 包成一个链式 API,比如:

class Pipeline:

    def __init__(self, data):

        self.data = data


    def filter(self, func):

        self.data = list(filter(func, self.data))

        return self


    def map(self, func):

        self.data = list(map(func, self.data))

        return self


    def get(self):

        return self.data


data = Pipeline([1, 2, 3, 4, 5, 6]).filter(lambda x: x % 2 == 0).map(lambda x: x * x).get()

print(data)  # [4, 16, 36]

是不是有点 Pandas 的味道?对,其实很多数据处理库底层也在用类似思想。

你可能会问:filter() 能不能用于生成器、文件、数据库这些大型数据集?

答案是:当然可以!尤其是大数据流的场景,filter() 的惰性机制反而是个优势。比如你用 open() 打开一个巨大的日志文件,要筛掉空行:

with open('biglog.txt') as f:

    lines = filter(lambda line: line.strip(), f)

    for line in lines:

        print(line)

这时候它就像个高性能的管道,只处理当前一行,内存占用极小。

写在最后

其实我觉得 filter() 就是 Python 中那种“看起来不起眼,但用起来贼舒服”的小工具,初看平平无奇,用熟之后真香无比。它教会我们写代码不是一味用大锤去敲,而是要挑对工具,用最简单的方式表达最清晰的意图。

当然啦,兄弟们在用 filter 的时候也别搞得太复杂,嵌套五六层谁看得懂啊?写代码,不是炫技,而是沟通——沟通和未来的你,以及你那些不情愿接你班的倒霉同事。

所以,有空多练练 filter(),再顺带搞懂它的几个兄弟,咱们写代码的时候就能少绕点弯路,多一些优雅。

讲这么多,就一句话总结:filter() 不神秘,但值得你认真用。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2025-06-27 09:18
  • 阅读 ( 68 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
小柒
小柒

2172 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2172 文章
  3. Pack 1335 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章