python输入后缀表达式,输出表达式的算术运算结果或error
在Python中常见的异常类型在Java中也常被提到,像数组越界,内存溢出等异常。不同的是名称比较不同而已。
异常处理作为编程语言中重要的逻辑处理机制之一, 该处理方式与Java的异常处理方式基本类似,提供try...except... finally... 方式进行异常的处理(其用法与Java的try...catch...finally...非常类似,就名字不同而已)。
常见的异常:ZeroDivisionError(除零异常)、IOError(IO异常)、ImportError(模块导入异常)、IndexError(索引不存在,类似于越界)等。
异常名称 | 描述 |
---|---|
BaseException | 所有异常的基类 |
SystemExit | 解释器请求退出 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
Exception | 常规错误的基类 |
StopIteration | 迭代器没有更多的值 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
StandardError | 所有的内建标准异常的基类 |
ArithmeticError | 所有数值计算错误的基类 |
FloatingPointError | 浮点计算错误 |
OverflowError | 数值运算超出最大限制 |
ZeroDivisionError | 除(或取模)零 (所有数据类型) |
AssertionError | 断言语句失败 |
AttributeError | 对象没有这个属性 |
EOFError | 没有内建输入,到达EOF 标记 |
EnvironmentError | 操作系统错误的基类 |
IOError | 输入/输出操作失败 |
OSError | 操作系统错误 |
WindowsError | 系统调用失败 |
ImportError | 导入模块/对象失败 |
LookupError | 无效数据查询的基类 |
IndexError | 序列中没有此索引(index) |
KeyError | 映射中没有这个键 |
MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
NameError | 未声明/初始化对象 (没有属性) |
UnboundLocalError | 访问未初始化的本地变量 |
ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
NotImplementedError | 尚未实现的方法 |
SyntaxError | Python 语法错误 |
IndentationError | 缩进错误 |
TabError | Tab 和空格混用 |
SystemError | 一般的解释器系统错误 |
TypeError | 对类型无效的操作 |
ValueError | 传入无效的参数 |
UnicodeError | Unicode 相关的错误 |
UnicodeDecodeError | Unicode 解码时的错误 |
UnicodeEncodeError | Unicode 编码时错误 |
UnicodeTranslateError | Unicode 转换时错误 |
Warning | 警告的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
FutureWarning | 关于构造将来语义会有改变的警告 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |
答案:
后缀表达式也叫逆波兰表达式,运算符位于操作数的后面。
例如:
中缀表达式:3+4*5-6
转换为后缀表达式:345*+6-
即后缀表达式中,操作数在前,运算符在后。计算后缀表达式的过程可以用栈来处理。具体步骤如下:
根据上述流程,我们可以编写如下的Python代码实现后缀表达式的计算:
def eval_postfix(expr):
stack = []
for token in expr:
if token.isdigit(): # 如果是操作数,直接入栈
stack.append(int(token))
else:
# 如果是运算符,弹出栈顶的两个操作数进行运算,结果再次入栈
num2 = stack.pop()
num1 = stack.pop()
if token == '+':
stack.append(num1 + num2)
elif token == '-':
stack.append(num1 - num2)
elif token == '*':
stack.append(num1 * num2)
elif token == '/':
stack.append(num1 / num2)
return stack.pop() # 最终栈中只剩下一个数,即为后缀表达式的计算结果
处理错误的方法包括:
def eval_postfix(expr):
stack = []
for token in expr:
if token.isdigit():
stack.append(int(token))
else:
try: # 使用try-except处理除数为0的情况
num2 = stack.pop()
num1 = stack.pop()
if token == '+':
stack.append(num1 + num2)
elif token == '-':
stack.append(num1 - num2)
elif token == '*':
stack.append(num1 * num2)
elif token == '/':
stack.append(num1 / num2)
except ZeroDivisionError:
print("除数为0错误!")
return None # 返回None表示出错
if len(stack) == 1:
return stack.pop()
else:
print("后缀表达式不合法!")
return None # 返回None表示出错