如何实现支持多参数加减乘幂、位运算的Python通用计算函数?
问题根源
你用到的operator模块下的sub/mul/pow/or_/and_都是二元运算函数,仅支持传入2个参数,无法直接处理多参数序列;仅+对应的sum支持直接传入可迭代对象计算,所以其他运算符会报错。
解决方案
用functools.reduce将二元运算迭代应用到所有参数上,符合你要求的从左到右依次运算的逻辑,修复后代码如下:
import operator from functools import reduce def multi_calculator(*args: int, operation='+'): ops = { '+': sum, '-': lambda x: reduce(operator.sub, x), '*': lambda x: reduce(operator.mul, x), '**': lambda x: reduce(operator.pow, x), '|': lambda x: reduce(operator.or_, x), '&': lambda x: reduce(operator.and_, x), } if operation not in ops: return 'Unknown operator' elif len(args) == 0: return 0 elif len(args) == 1: return args[0] else: return ops[operation](args) # 测试用例 print(multi_calculator(1, 3, 5, operation='-')) # 输出-7,符合预期 print(multi_calculator(2, 3, 4, operation='*')) # 输出24 print(multi_calculator(1, 2, 3, operation='|')) # 输出3
核心修改说明
- 新增引入
functools.reduce,作用是将二元函数依次作用于序列的每一个元素,最终返回累计结果,刚好匹配多参数连续运算的需求 - 调整运算符映射字典,除加法仍直接用原生
sum保证效率外,其余运算符均通过lambda包装为支持传入序列的函数,内部用reduce实现多参数运算 - 把import操作移到函数外部,避免每次调用函数都重复导入模块
内容的提问来源于stack exchange,提问作者python_newbie
相关产品推荐
相关产品推荐

