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
相关产品推荐
相关产品推荐

