map、filter、reduce的核心区别是:map一对一转换元素,filter按条件筛选子集,reduce累积计算得单值;三者均不修改原数据,返回惰性对象(reduce除外),体现函数式编程思想。

这三个函数都是 Python 中处理可迭代对象的高阶函数,核心区别在于:map 用于逐个转换元素,filter 用于筛选符合条件的元素,reduce 用于累积计算得到单个结果。
map:一对一映射,生成新序列
map 接收一个函数和一个可迭代对象,把函数依次作用在每个元素上,返回一个 map 对象(惰性求值,需转 list 等才可见结果)。原数据不变,输出长度与输入一致。
常见用法示例:
- list(map(lambda x: x * 2, [1, 2, 3])) → [2, 4, 6]
- list(map(str.upper, ['a', 'b', 'c'])) → ['A', 'B', 'C']
- 注意:传入函数必须接受一个参数;多个可迭代对象可并行传入(如 map(func, a, b)),func 需支持多参数
filter:按条件过滤,输出子集
filter 接收一个判断函数(返回 True/False)和一个可迭代对象,只保留使函数返回 True 的元素,也返回惰性对象。输出长度 ≤ 输入长度,不改变原数据。
立即学习“Python免费学习笔记(深入)”;
常见用法示例:
- list(filter(lambda x: x > 2, [1, 2, 3, 4])) → [3, 4]
- list(filter(None, [0, '', [], 'hello', 42])) → ['hello', 42](None 表示保留真值)
- 函数返回值必须是布尔类型或可转为布尔值;空序列、0、None、空字符串等会被过滤掉
reduce:归约聚合,产出单一值
reduce 不是内置函数,需从 functools 导入:from functools import reduce。它接收一个二元函数(两个参数)、一个可迭代对象,以及可选的初始值,将函数依次应用于累积结果和下一个元素,最终返回一个值。
常见用法示例:
- reduce(lambda x, y: x + y, [1, 2, 3, 4]) → 10
- reduce(lambda x, y: x if x > y else y, [2, 8, 1, 6]) → 8(找最大值)
- 若提供初始值(如 reduce(func, seq, init)),第一次调用是 func(init, seq[0]);空序列且无初始值会报错
三者都遵循函数式编程思想:不修改原数据、无副作用、强调“做什么”而非“怎么做”。实际使用中,列表推导式常可替代 map 和 filter(更 Pythonic),而 reduce 多数场景可用 sum、max、any 等内置函数或循环代替,除非逻辑复杂需自定义累积过程。










