title: 过滤
description: filter() 是 Python 的内置高阶函数,用于过滤序列中的元素。它接收一个函数和一个可迭代对象作为参数,返回一个迭代器(Python 3 中)包含所有使函数返回 True 的元素。
Python filter() 函数详解与实用案例
在 Python 函数式编程的工具箱里,filter() 是处理序列「筛选」场景的核心工具之一——它不会修改元素,只会根据规则精准保留或剔除,和 map() 是两个互补的常用高阶函数。
1. filter() 函数基础
核心定义
filter() 是 Python 内置的高阶函数,它接收两个参数:
- 判定函数:返回
True/False(或隐式转换为布尔值的对象,如空字符串、0、None都是False) - 可迭代对象:比如列表、元组、生成器、字符串等
Python 3 中,filter() 不会直接返回筛选后的序列,而是返回一个惰性迭代器——只有在真正遍历(如 next()、for 循环、转成列表/元组)时才会计算结果,能大幅节省大数据集的内存。
基本语法
与 map() 的核心区别
我们用表格对比更直观:
2. 基础入门:两个简单场景
场景1:过滤列表中的奇数
这里先用显式的自定义函数写,方便理解判定逻辑:
场景2:过滤无效字符串(空值、全空格)
处理爬虫或表单数据时,经常会遇到需要清理的空内容,filter() 处理起来很顺手:
3. 进阶特性:惰性求值的魅力
为什么 Python 3 把 filter() 改成了返回迭代器?核心是内存优化——不需要一次性把所有符合条件的元素加载到内存里。
举个例子,我们可以逐步观察迭代器的执行过程:
4. 日常简化:结合 lambda 表达式
如果判定逻辑很简单(不需要复用),没必要单独写自定义函数,lambda + filter 是黄金组合:
5. 经典实用案例:埃拉托斯特尼筛法(生成无限素数)
这是 filter() 和无限生成器结合的绝佳例子——能高效地生成任意范围的素数,而且内存占用极低:
6. 现代 Python 替代方案:列表/生成器表达式
虽然 filter() 很经典,但对于简单的、只需要一次结果的筛选,列表推导式或生成器表达式通常更易读(符合 Python 的「可读性优先」原则):
7. 动手练习:筛选回文数
回文数是指正读反读都一样的数(如121、1331),我们可以用 filter() 快速实现:
8. 性能与使用场景建议
性能对比
- 内存效率:
filter()和生成器表达式 > 列表推导式(后两者不需要预存所有结果) - 速度效率:三者在简单场景下差异极小,列表推导式可能略快(因为不需要额外的函数调用开销)
使用场景选择
9. 总结
filter() 是 Python 函数式编程中不可或缺的筛选工具,但现代 Python 开发中不需要盲目使用——可读性永远是第一位的。
核心要点回顾:
- 接收「判定函数」和「可迭代对象」
- Python 3 返回惰性迭代器,内存友好
- 可以结合 lambda、自定义函数、无限生成器使用
- 简单场景优先考虑列表/生成器表达式
10. 扩展阅读
- Python 官方文档:Built-in Functions — filter()
- 补充过滤工具:
itertools.filterfalse()(返回判定函数为False的元素) - 函数式编程三剑客:
map()、filter()、functools.reduce()(Python 3 需导入)

