You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 10:06:05