Functools -- reduce
reduce 把一个可迭代对象缩减为单个值。
过程:
value = func( func( func( initial, x1 ), x2 ), x3 ) ...
使用方式:
from functools import reduce
reduce(function, iterable, initializer)
- function(a, b):把两个值合并成一个
- initializer 可选:初始值
from functools import reduce
nums = [1, 2, 3, 4]
result = reduce(lambda a, b: a + b, nums)
print(result) # 10
等价于:
(((1 + 2) + 3) + 4)
from functools import reduce
nums = [1, 2, 3, 4]
result = reduce(lambda a, b: a * b, nums)
print(result) # 24
result = reduce(lambda a, b: a + b, [1, 2, 3], 10)
print(result) # 初始值 10 -> 10 + 1 + 2 + 3 = 16
result = reduce(lambda a, b: a if a > b else b, [3, 9, 1, 7])
print(result) # 9
(当然也可以直接用 max)
words = ["hello", "world", "python"]
result = reduce(lambda a, b: a + " " + b, words)
print(result) # hello world python
推荐用 " “.join(words)。
例如:汇总 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
nested = [[1, 2], [3, 4], [5, 6]]
flat = reduce(lambda a, b: a + b, nested)
print(flat)
# [1, 2, 3, 4, 5, 6]
reduce 可以做状态机、累计器这类任务:
nums = [1, 2, 3, 4]
result = reduce(lambda s, x: {"sum": s["sum"] + x}, nums, {"sum": 0})
print(result) # {'sum': 10}
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}
| 场景 | 最佳工具 |
|---|---|
| 累加数字 | sum() |
| 找最大/最小 | max() / min() |
| 拼接字符串 | “".join() |
| 自定义累计操作 | reduce ✅️ |
| 复杂合并、带状态、非对称结构 | reduce ✅️ |
你真正需要 reduce 的情况是:
- 你正在“逐步折叠一个序列”
- 你需要“状态在前一次结果基础上累加”
- 你需要自定义组合逻辑
reduce = 把序列压缩成一个值,用前一次结果 + 当前值不断折叠。