后缀表达式出现意外的 Python 错误。谁能解释一下为什么我会收到此错误?

问题描述 投票:0回答:1
from collections import deque
def postfixExpression(expression: str) -> int:
    if not expression:
        return -1
    expression_list = expression.split(" ")
    stack = deque()
    for ex in expression_list:
        print(ex, stack)
        try:
            stack.append(int(ex))
        except ValueError:
            b = stack.pop()
            a = stack.pop()
            switcher = {
                "+" : a + b,
                "-" : a - b,
                "*" : a * b,
                "/" : int(a / b),
                "^" : a ** b,
            }
            if ex not in switcher.keys():
                raise ValueError(f"Wrong expression-> {ex}")
            else:
                stack.append(switcher.get(ex))
    return stack.pop()

expression = "2 3 7 - 7 + 9 7 2 + - * *"
print(f"\nResult {postfixExpression(expression)}")

上面是一个Python的Postfix评估程序。它适用于大多数情况。

但是当我使用输入 "2 3 7 - 7 + 9 7 2 + - * *" 时,它给出了 ZeroDivisionError,即使我没有在输入中使用divide(/)。

错误信息:

$ python temp/temp.py 
4 deque([])
6 deque([4])
* deque([4, 6])
2 deque([24])
1 deque([24, 2])
- deque([24, 2, 1])
+ deque([24, 1])
7 deque([25])
7 deque([25, 7])
+ deque([25, 7, 7])
7 deque([25, 14])
6 deque([25, 14, 7])
+ deque([25, 14, 7, 6])
* deque([25, 14, 13])
* deque([25, 182])
3 deque([4550])
7 deque([4550, 3])
- deque([4550, 3, 7])
7 deque([4550, -4])
+ deque([4550, -4, 7])
9 deque([4550, 3])
7 deque([4550, 3, 9])
2 deque([4550, 3, 9, 7])
+ deque([4550, 3, 9, 7, 2])
- deque([4550, 3, 9, 9])
* deque([4550, 3, 0])
Traceback (most recent call last):
  File "C:\Users\...\temp.py", line 11, in postfixExpression
    stack.append(int(ex))
ValueError: invalid literal for int() with base 10: '*'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\...\temp.py", line 52, in main
    print(f"\nresult {postfixExpression(expression)}")
  File "C:\Users\...\temp.py", line 19, in postfixExpression
    "/" : int(a / b),
ZeroDivisionError: division by zero

当我评论 "/" : int(a / b), 切换器字典中的行时,它给出了预期的答案,即 0。

任何人都可以解释为什么我会收到此错误(主要)以及如何解决它?

python python-3.x stack
1个回答
1
投票

问题是您在设置 switcher 字典时正在评估

所有 
操作。因此,无论您的代码遇到哪个运算符,它都会计算堆栈顶部两个值的和、差、乘积和商。然后它会查看操作符来决定实际使用哪一个。在这种情况下,您的
b
值为零,因此它确实试图除以零。

有多种方法可以解决此问题,包括(但不限于):

  • 使用
    lambda
    字典中的
    switcher
    函数,并且只调用需要的函数
  • 只需使用实际的
    switch
    语句直接在代码中计算适当的值,而不是使用字典(这需要 Python 3.10+)
  • 使用
    if
    -
    elif
    链直接在代码中计算适当的值,而不是使用字典
© www.soinside.com 2019 - 2024. All rights reserved.