Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Functools -- reduce

✅ reduce() —— 核心概念一句话

reduce 把一个可迭代对象缩减为单个值。

过程:

value = func( func( func( initial, x1 ), x2 ), x3 ) ... 

使用方式:

from functools import reduce

reduce(function, iterable, initializer)
  • function(a, b):把两个值合并成一个
  • initializer 可选:初始值

🌰 1. 最经典示例:累加

from functools import reduce

nums = [1, 2, 3, 4]

result = reduce(lambda a, b: a + b, nums)
print(result)  # 10

等价于:

(((1 + 2) + 3) + 4)

🌰 2. 累乘

from functools import reduce

nums = [1, 2, 3, 4]

result = reduce(lambda a, b: a * b, nums)
print(result)  # 24

🌰 3. 带 initializer(初始值)

result = reduce(lambda a, b: a + b, [1, 2, 3], 10)
print(result)  # 初始值 10 -> 10 + 1 + 2 + 3 = 16

🌰 4. 求最大值 / 最小值

result = reduce(lambda a, b: a if a > b else b, [3, 9, 1, 7])
print(result)  # 9

(当然也可以直接用 max)

🌰 5. 字符串拼接(不推荐,但能用)

words = ["hello", "world", "python"]

result = reduce(lambda a, b: a + " " + b, words)
print(result)  # hello world python

推荐用 " “.join(words)。

🌰 6. reduce 用于字典中的计算(常用)

例如:汇总 stock 数据:

stocks = [
    {"code": "600001", "amount": 100},
    {"code": "600002", "amount": 40},
    {"code": "600003", "amount": 60},
]

total = reduce(lambda a, b: a + b["amount"], stocks, 0)
print(total)  # 200

🌰 7. reduce 实现 flatten(扁平化列表)

nested = [[1, 2], [3, 4], [5, 6]]

flat = reduce(lambda a, b: a + b, nested)
print(flat)
# [1, 2, 3, 4, 5, 6]

🌰 8. reduce 实现数字累加器(积累状态)

reduce 可以做状态机、累计器这类任务:

nums = [1, 2, 3, 4]

result = reduce(lambda s, x: {"sum": s["sum"] + x}, nums, {"sum": 0})
print(result)  # {'sum': 10}

🌰 9. reduce 实现最大股票涨幅(真实业务示例)

stocks = [
    {"code": "600001", "change": 5.3},
    {"code": "600002", "change": -2.1},
    {"code": "600003", "change": 8.6},
]

max_stock = reduce(
    lambda a, b: a if a["change"] > b["change"] else b,
    stocks
)

print(max_stock)
# {'code': '600003', 'change': 8.6}

🌟 reduce vs sum / max / min / join —— 什么时候用?

场景 最佳工具
累加数字 sum()
找最大/最小 max() / min()
拼接字符串 “".join()
自定义累计操作 reduce ✅️
复杂合并、带状态、非对称结构 reduce ✅️

你真正需要 reduce 的情况是:

  • 你正在“逐步折叠一个序列”
  • 你需要“状态在前一次结果基础上累加”
  • 你需要自定义组合逻辑

🎯 总结:reduce 的一句话记忆

reduce = 把序列压缩成一个值,用前一次结果 + 当前值不断折叠。