如何解决Python中switch逻辑下的Zero Division Error问题?
问题根源分析
你遇到的ZeroDivisionError并不是乘法操作触发的,而是字典初始化时会预先计算所有键对应的表达式导致的。Python创建字典时,所有分支的表达式都会被立即执行,不管你后续是否使用该键。比如处理最后一个*运算符时,栈中弹出0(firstNumber)和42(secondNumber),此时字典里的"/"分支表达式secondNumber / firstNumber会被计算为42 / 0,直接触发除零错误——哪怕当前要执行的是乘法。
修复方案
核心思路是避免预先计算所有运算符的表达式,以下两种方式都可以解决问题:
方案1:用if-elif-else替代字典
逻辑清晰,只有匹配当前运算符的分支才会执行计算:
def reversePolishNotation(tokens): operators = ["+", "-", "*", "/"] stack = [] for token in tokens: if token not in operators: stack.append(int(token)) else: firstNumber = stack.pop() secondNumber = stack.pop() if token == "+": res = firstNumber + secondNumber elif token == "-": res = secondNumber - firstNumber elif token == "*": res = firstNumber * secondNumber elif token == "/": res = secondNumber / firstNumber stack.append(int(res)) return int(stack[-1])
方案2:用lambda函数延迟计算
让字典存储lambda表达式,只有调用时才执行运算:
def reversePolishNotation(tokens): operators = ["+", "-", "*", "/"] stack = [] for token in tokens: if token not in operators: stack.append(int(token)) else: firstNumber = stack.pop() secondNumber = stack.pop() switcher = { "+": lambda a, b: a + b, "-": lambda a, b: b - a, "*": lambda a, b: a * b, "/": lambda a, b: b / a } res = switcher[token](firstNumber, secondNumber) stack.append(int(res)) return int(stack[-1])
验证结果
修复后的代码可以正常处理你提供的测试用例,最终返回结果为0,不会触发ZeroDivisionError。
内容的提问来源于stack exchange,提问作者Ankit Kumar
相关产品推荐
相关产品推荐

