Python中如何从字符串输入推导运算符优先级实现简易计算器?
解决Python计算器运算符优先级处理的两种方案
方案1:直接使用内置eval()函数(最简实现,适合个人自用场景)
这是成本最低的实现方式,Python内置的eval()函数可以直接解析符合Python语法的运算字符串,自动处理运算符优先级、类型转换等逻辑,不需要自己手动拆分字符串判断运算符。
你只需要提前把用户输入的非常规运算符替换成Python支持的运算符即可,示例代码如下:
# 接收输入并替换非常规乘号 alg_operation = input("请输入运算式:").replace("×", "*").replace("x", "*") # 直接解析运算,天然支持**幂运算、//整除、*乘法、+/-加减法的优先级 result = eval(alg_operation) print(f"运算结果:{result}")
测试你举的例子输入95+8×2,替换后变成95+8*2,eval()会自动先算乘法再算加法,输出结果为111,完全符合需求。
注意:
eval()会执行输入字符串里的任意Python代码,如果你的计算器要开放给其他用户使用,存在注入风险,个人自用完全没问题。
方案2:自行实现调度场算法(适合学习底层逻辑场景)
如果不想依赖内置函数,想要自己实现优先级处理逻辑,可以使用专门处理中缀表达式优先级的调度场算法(Shunting-yard Algorithm),不需要枚举所有运算符排列组合,只需要预先定义好各运算符的优先级即可。
核心步骤:
- 预先定义运算符优先级:
**(幂)>*///(乘/整除)>+/-(加/减) - 拆分输入字符串为独立token(数字、运算符)
- 用两个栈分别存储待处理的运算符、输出的后缀表达式(逆波兰表达式)
- 遍历所有token按规则处理后,计算后缀表达式得到结果
简易实现示例:
# 定义运算符优先级 op_priority = { '+': 1, '-': 1, '*': 2, '//': 2, '**': 3 } def calculate_suffix(suffix): stack = [] for token in suffix: if isinstance(token, float): stack.append(token) else: b = stack.pop() a = stack.pop() if token == '+': stack.append(a + b) elif token == '-': stack.append(a - b) elif token == '*': stack.append(a * b) elif token == '//': stack.append(a // b) elif token == '**': stack.append(a ** b) return stack[0] # 后续补充输入转token、调度场算法转后缀表达式的逻辑即可,整体代码量远低于枚举排列组合的实现
这种实现方式只需要针对每个运算符写一次处理逻辑,不管运算符有多少种,都不需要排列组合所有情况,维护成本极低。
内容的提问来源于stack exchange,提问作者Koustubh Jain
相关产品推荐
相关产品推荐

