理解 filter() 函数的核心作用:按条件筛选数据
掌握其基本语法、参数含义及返回值特性
能够结合命名函数、lambda 表达式和 None 进行灵活过滤
学会将 filter() 与 map() 等函数组合使用,实现数据处理流水线
filter() 是 Python 的内置高阶函数,用于从可迭代对象(如列表、元组、集合等)中筛选出满足特定条件的元素。它通过将一个判断函数应用于每个元素,保留那些使函数返回 True 的项。该函数是函数式编程中“过滤”操作的标准工具,适用于数据清洗、条件提取等场景。
filter(function, iterable)参数说明:
function:一个接收单个参数并返回布尔值(True/False)的函数。
若返回 True,保留该元素;
若返回 False,丢弃该元素。
iterable:要筛选的可迭代对象(如列表、元组、集合等)。
特殊用法:当
function为None时,filter()会自动保留所有“真值”(truthy)元素,过滤掉“假值”(falsy)如0、""、None、[]等。
返回值:
一个 filter 对象(即迭代器),通常需用 list()、tuple() 等转换为具体数据结构。
筛选以 'a' 开头的单词
def starts_a(w):
return w.startswith("a")
li = ["apple", "banana", "avocado", "cherry", "apricot"]
res = filter(starts_a, li)
print(list(res))输出:
['apple', 'avocado', 'apricot']说明:starts_a 函数判断字符串是否以字母 'a' 开头,filter() 仅保留满足条件的水果名称。
使用命名函数筛选偶数
def even(n):
return n % 2 == 0
a = [1, 2, 3, 4, 5, 6]
b = filter(even, a)
print(list(b))输出:
[2, 4, 6]说明:even 函数检查数字是否能被 2 整除,filter() 从中提取所有偶数。
使用 Lambda 表达式简化代码
a = [1, 2, 3, 4, 5, 6]
b = filter(lambda x: x % 2 == 0, a)
print(list(b))输出:
[2, 4, 6]说明:
用一行 lambda 替代独立函数,使代码更紧凑,适合简单逻辑。
组合
filter()与map()实现数据处理流水线
a = [1, 2, 3, 4, 5, 6]
# 先筛选偶数,再将其翻倍
even_numbers = filter(lambda x: x % 2 == 0, a)
doubled = map(lambda x: x * 2, even_numbers)
print(list(doubled))输出:
[4, 8, 12]执行流程:
filter 得到 [2, 4, 6]
map 将其变为 [4, 8, 12]
这种链式调用体现了函数式编程的“声明式”风格:描述“做什么”,而非“怎么做”。
筛选长度大于 5 的字符串
a = ["apple", "banana", "cherry", "kiwi", "grape"]
b = filter(lambda w: len(w) > 5, a)
print(list(b))输出:
['banana', 'cherry']说明:
只保留字符数超过 5 的水果名称。
使用 None 过滤假值(Truthy/Falsy 判断)
L = ["apple", "", None, "banana", 0, "cherry"]
A = filter(None, L)
print(list(A))输出:
['apple', 'banana', 'cherry']说明:filter(None, iterable) 是一种快捷方式,等价于 filter(bool, iterable),会自动移除所有假值:
""(空字符串)
None
0
[]、{} 等空容器(若存在)
filter() 用于条件筛选,只保留使判断函数返回 True 的元素。
支持命名函数、lambda 表达式,也支持 None 作为函数参数进行真值过滤。
返回的是惰性求值的迭代器,需转换为列表等结构才能查看内容。
可与其他高阶函数(如 map()、reduce())组合,构建清晰的数据处理管道。
对于简单筛选任务,列表推导式(如 [x for x in a if x % 2 == 0])有时更直观;但 filter() 在函数式风格或复用判断逻辑时更具优势。
使用 filter() 和 lambda,如何从列表 [-3, -1, 0, 2, 5] 中筛选出正整数?
比较以下两种写法的优劣:
list(filter(lambda x: x > 0, nums))
[x for x in nums if x > 0]
如果传入 filter() 的函数对某些输入抛出异常(如对非数字调用 x % 2),会发生什么?如何安全处理?