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

Python后缀表达式计算器报NameError错误,如何修复并确认代码正确性?

后缀表达式计算Python代码的错误修复与优化建议

我编写了一段用于计算后缀表达式(Postfix notation)的Python代码:

operator = ["+", "-", "*", "/", "^"]
operand=[]
exp=input("Please enter something in postfix notation:")
expression = exp.split(' ')
for ele in expression:
        if(ele not in operator):
            operand.append(ele)
        else:
            number1=eval(operand.pop())
            number2=eval(operand.pop())
        if(ele=="+"):
            answer=number2+number1
        elif(ele=="-"):
            answer=number2-number1
        elif(ele=="*"):
            answer=number2*number1
        elif(ele=="/"):
            answer=number2/number1
        elif(ele=="^"):
            answer=number2**number1
        operand.append(str(answer))
print("answer =", operand[0])

运行时输入计算内容后,程序抛出NameError: name 'answer' is not defined错误,指向operand.append(str(answer))行。请问该如何修复此问题?其余代码是否存在问题?


错误原因与修复

1. NameError的根源

当ele是操作数(不属于运算符列表)时,代码只会执行if(ele not in operator)分支,不会进入后续的运算符判断逻辑,此时answer变量从未被定义,但最后强制执行operand.append(str(answer)),直接触发未定义错误。

2. 修复方案

将operand.append(str(answer))移到运算符分支的内部,只有处理运算符时才需要计算结果并追加到栈中;操作数直接追加到栈即可,无需走这一步。

修复后的核心循环代码:

for ele in expression:
    if ele not in operator:
        operand.append(ele)
    else:
        number1 = eval(operand.pop())
        number2 = eval(operand.pop())
        if ele == "+":
            answer = number2 + number1
        elif ele == "-":
            answer = number2 - number1
        elif ele == "*":
            answer = number2 * number1
        elif ele == "/":
            answer = number2 / number1
        elif ele == "^":
            answer = number2 ** number1
        operand.append(str(answer))

其余代码的潜在问题与优化

  • eval的安全风险:eval会执行任意字符串代码,若输入包含恶意内容(如__import__('os').system('rm -rf /')),会造成严重安全问题。建议改用float()或int()转换操作数:
    number1 = float(operand.pop())
    number2 = float(operand.pop())
    
  • 输入合法性缺失:
    • 未处理空输入、多余空格导致的空字符串;
    • 未检查后缀表达式格式合法性(如运算符出现时栈中操作数不足2个),会触发IndexError;
    • 未处理除零错误。
  • 变量命名冲突:operator是Python内置模块名,建议改为operators避免命名冲突;operand改为operand_stack更清晰,体现栈的用途。
  • 除法逻辑可选优化:当前用/得到浮点数结果,若需要整数除法(向下取整),可改用//,但需注意负数的处理差异。

优化后的完整代码示例

operators = ["+", "-", "*", "/", "^"]
operand_stack = []
exp = input("Please enter something in postfix notation: ")
expression = exp.split(' ')

try:
    for ele in expression:
        if ele.strip() == "":  # 过滤多余空格产生的空字符串
            continue
        if ele not in operators:
            # 尝试转换为数字,失败则抛出异常
            operand_stack.append(float(ele))
        else:
            if len(operand_stack) < 2:
                raise ValueError("Invalid postfix expression: insufficient operands")
            number1 = operand_stack.pop()
            number2 = operand_stack.pop()
            if ele == "+":
                result = number2 + number1
            elif ele == "-":
                result = number2 - number1
            elif ele == "*":
                result = number2 * number1
            elif ele == "/":
                if number1 == 0:
                    raise ZeroDivisionError("Division by zero")
                result = number2 / number1
            elif ele == "^":
                result = number2 ** number1
            operand_stack.append(result)
    if len(operand_stack) != 1:
        raise ValueError("Invalid postfix expression: too many operands")
    print("answer =", operand_stack[0])
except (ValueError, ZeroDivisionError, IndexError) as e:
    print(f"Error: {e}")

内容的提问来源于stack exchange,提问作者Remaster Voyage

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:45:22