源本科技 | 码上会

Python 中的 filter()

2026/01/18
7
0

学习目标

  • 理解 filter() 函数的核心作用:按条件筛选数据

  • 掌握其基本语法、参数含义及返回值特性

  • 能够结合命名函数、lambda 表达式和 None 进行灵活过滤

  • 学会将 filter()map() 等函数组合使用,实现数据处理流水线


什么是 filter() 函数

filter() 是 Python 的内置高阶函数,用于从可迭代对象(如列表、元组、集合等)中筛选出满足特定条件的元素。它通过将一个判断函数应用于每个元素,保留那些使函数返回 True 的项。该函数是函数式编程中“过滤”操作的标准工具,适用于数据清洗、条件提取等场景。


基本语法

filter(function, iterable)

参数说明:

  • function:一个接收单个参数并返回布尔值(True/False)的函数。

    • 若返回 True,保留该元素;

    • 若返回 False,丢弃该元素。

  • iterable:要筛选的可迭代对象(如列表、元组、集合等)。

特殊用法:当 functionNone 时,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() 仅保留满足条件的水果名称。


示例 1

使用命名函数筛选偶数

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() 从中提取所有偶数。


示例 2

使用 Lambda 表达式简化代码

a = [1, 2, 3, 4, 5, 6]
b = filter(lambda x: x % 2 == 0, a)
print(list(b))

输出:

[2, 4, 6]

说明:
用一行 lambda 替代独立函数,使代码更紧凑,适合简单逻辑。


示例 3

组合 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]

执行流程:

  1. filter 得到 [2, 4, 6]

  2. map 将其变为 [4, 8, 12]

这种链式调用体现了函数式编程的“声明式”风格:描述“做什么”,而非“怎么做”。


示例 4

筛选长度大于 5 的字符串

a = ["apple", "banana", "cherry", "kiwi", "grape"]
b = filter(lambda w: len(w) > 5, a)
print(list(b))

输出:

['banana', 'cherry']

说明:
只保留字符数超过 5 的水果名称。


示例 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() 在函数式风格或复用判断逻辑时更具优势。


思考题

  1. 使用 filter()lambda,如何从列表 [-3, -1, 0, 2, 5] 中筛选出正整数?

  2. 比较以下两种写法的优劣:

    • list(filter(lambda x: x > 0, nums))

    • [x for x in nums if x > 0]

  3. 如果传入 filter() 的函数对某些输入抛出异常(如对非数字调用 x % 2),会发生什么?如何安全处理?