functools.reduce与singledispatch泛函数详解
请解释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()分支判断。