Python中如何将接收函数返回值为参数的函数封装为可调用变量
实现multiply_add函数的简便方案
现有函数
def add(*numbers, squared=False): return (sum(numbers) ** 2) if squared else sum(numbers) def multiply(*numbers, half=False): mult = 1 for i in numbers: mult *= i return (mult / 2) if half else mult
需求
需要定义multiply_add变量作为函数调用,调用时传入add的参数和multiply的其他参数,执行逻辑为:先通过add得到结果,再将该结果作为multiply的首个参数执行运算。
示例调用及预期:
# 调用示例 multiply_add((5, 3, 2), 7, half=True) # 预期结果:35.0(add计算5+3+2=10,10*7=70后除以2得35)
希望用functools.partial这类简便方式实现,而非自定义函数。
解决方案
直接用lambda封装(最简便)
functools.partial更适合固定参数绑定,而这里需要动态先执行add生成参数再传给multiply,用lambda直接封装逻辑更直观:
# 定义multiply_add multiply_add = lambda add_nums, *mult_rest, **mult_kwargs: multiply(add(*add_nums), *mult_rest, **mult_kwargs) # 测试 print(multiply_add((5, 3, 2), 7, half=True)) # 输出35.0
结合partial的实现(如果一定要用partial)
本质还是用lambda处理参数转换,再结合partial完成绑定:
from functools import partial multiply_add = lambda add_nums, *rest, **kwargs: partial(multiply, add(*add_nums))(*rest, **kwargs) # 测试同样有效 print(multiply_add((5, 3, 2), 7, half=True)) # 35.0
扩展:支持add的关键字参数
如果需要传递add的squared参数,可以调整lambda来接收相关参数:
multiply_add = lambda add_nums, *mult_rest, add_kwargs=None, **mult_kwargs: multiply(add(*add_nums, **(add_kwargs or {})), *mult_rest, **mult_kwargs) # 测试带squared的场景 print(multiply_add((5,3,2), 7, add_kwargs={"squared": True}, half=True)) # 输出350.0
内容的提问来源于stack exchange,提问作者Aleks K.
相关产品推荐
相关产品推荐

