源本科技 | 码上会

Python 中的 reduce()

2026/01/18
6
0

学习目标

  • 理解 reduce() 函数的作用与适用场景

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

  • 能够结合 lambda 表达式、自定义函数和 operator 模块使用 reduce()

  • 区分 reduce()itertools.accumulate() 的功能差异


什么是 reduce() 函数

reduce() 是 Python 标准库 functools 模块中的一个高阶函数,用于对可迭代对象中的元素进行累积性操作,最终将其“归约”为一个单一的值。它适用于求和、求积、字符串拼接、找最大 / 最小值等需要逐步合并数据的场景。但不建议用于复杂逻辑——此时显式循环更清晰易读。

注意:reduce() 不是内置函数,必须通过 from functools import reduce 导入后才能使用。


基本语法

from functools import reduce

reduce(function, iterable[, initializer])

参数说明:

  • function:一个接收两个参数并返回一个值的函数(如 lambda x, y: x + y)。

  • iterable:要处理的可迭代对象(如列表、元组等)。

  • initializer(可选):初始值,会作为第一次调用 function 时的第一个参数。

返回值:

  • 一个单一的最终结果,类型取决于 function 的返回类型。


基础示例:字符串拼接

from functools import reduce

li = ["Java", "And", "Python"]
res = reduce(lambda x, y: x + " " + y, li)
print(res)

输出:

J

执行过程:

  1. "Java" + "And""Java And"

  2. "Java And" + "Python""Java And Python"


示例 1:使用命名函数求和

from functools import reduce

def add(x, y):
    return x + y

a = [1, 2, 3, 4, 5]
res = reduce(add, a)
print(res)

输出:

15

说明:
计算过程为 (((1 + 2) + 3) + 4) + 5 = 15,即从左到右依次累加。


示例 2:使用 Lambda 计算阶乘

from functools import reduce

a = [1, 2, 3, 4, 5]
res = reduce(lambda x, y: x * y, a)
print(res)

输出:

120

说明:
等价于 5! = 1 × 2 × 3 × 4 × 5 = 120


示例 3:结合 operator 模块

operator 模块提供了常用操作的函数形式,可直接用于 reduce()

import functools
import operator

a = [1, 3, 5, 6, 2]

print(functools.reduce(operator.add, a))   # 求和
print(functools.reduce(operator.mul, a))   # 求积
print(functools.reduce(operator.add, ["tech", "for", "dev"]))

输出:

17
180
techfordev

说明:

  • operator.add 等价于 lambda x, y: x + y

  • operator.mul 等价于 lambda x, y: x * y

  • 对字符串使用 operator.add 会直接拼接(无空格)


示例 4:使用 initializer(初始值)

from functools import reduce

a = [1, 2, 3]
res = reduce(lambda x, y: x + y, a, 10)
print(res)

输出:

16

执行过程:

  • 初始值为 10

  • (10 + 1) = 11

  • (11 + 2) = 13

  • (13 + 3) = 16

若未提供 initializer 且可迭代对象为空,reduce() 会抛出 TypeError。提供初始值可避免此问题。


reduce() 与 accumulate() 的区别

虽然两者都执行累积操作,但行为截然不同:

特性

reduce()

accumulate()

返回值

单一最终结果(如 15

所有中间结果的迭代器(如 [1, 3, 6, 10, 15]

输出类型

单个值

可迭代对象(需转为 list 查看)

典型用途

只需最终结果(如总和、乘积)

需要观察每一步的累积状态

导入模块

functools

itertools

示例对比:

from functools import reduce
from itertools import accumulate
from operator import add

a = [1, 2, 3, 4, 5]

# reduce: 只返回最终值
total = reduce(add, a)
print(total)  # 15

# accumulate: 返回每一步的累积结果
steps = list(accumulate(a, add))
print(steps)  # [1, 3, 6, 10, 15]

重点总结

  • reduce() 将可迭代对象通过二元函数逐步合并为一个值

  • 必须从 functools 导入,不是内置函数。

  • 支持自定义函数、lambda 表达式和 operator 模块中的函数。

  • 可选的 initializer 参数能提升健壮性,尤其在处理空序列时。

  • accumulate() 相比,reduce() 更适合“只关心最终结果”的场景。


思考题

  1. 如果对空列表 [] 调用 reduce(lambda x, y: x + y, []) 会发生什么?如何避免错误?

  2. 在什么情况下使用 sum()math.prod()reduce() 更合适?为什么?

  3. 尝试用 reduce() 实现查找列表中最大值的功能,并与内置函数 max() 对比代码简洁性和可读性。