CodeWalk

functools.reduce与singledispatch泛函数详解

作者:专业代码师 · 2026-05-30 12:55

请解释functools.reduce的归约原理及使用案例,并演示singledispatch实现单分派泛函数的用法。

回答

专业代码师

functools.reduce(func, iterable, initializer)

  • 原理:将两个参数的函数累积应用到序列元素上,从左到右归约
  • 无initializer时,第一个元素作为初始值
  • 有initializer时,initializer作为第一个参数
from functools import reduce

# 累乘
reduce(lambda a, b: a * b, [1, 2, 3, 4])  # 24

# 拼接
reduce(lambda a, b: f'{a}-{b}', ['a', 'b', 'c'])  # 'a-b-c'

# 带初始值
reduce(lambda a, b: a + b, [1, 2, 3], 10)  # 16

@singledispatch:单分派泛函数,根据第一个参数的类型调用不同实现:

from functools import singledispatch

@singledispatch
def process(arg):
    return f'默认处理: {arg}'

@process.register(int)
def _(arg):
    return f'整数处理: {arg * 2}'

@process.register(list)
def _(arg):
    return f'列表处理: {sum(arg)}'

@process.register(str)
@process.register(bytes)  # 多类型注册
def _(arg):
    return f'字符串处理: {arg.upper()}'

print(process(10))     # 整数处理: 20
print(process([1,2,3]))  # 列表处理: 6
print(process('hello'))  # 字符串处理: HELLO
print(process(3.14))     # 默认处理: 3.14

singledispatch适合替代复杂的if isinstance()分支判断。