HW02 運算子表達式
1.Notebook
2.YT
3.學習卡與測驗
4.import ast
import operator
# 定義支援的運算子
operators = {
ast.Add: operator.add, # +
ast.Sub: operator.sub, # -
ast.Mult: operator.mul, # *
ast.Div: operator.truediv, # /
ast.Pow: operator.pow, # ** (次方)
ast.USub: operator.neg, # 負數
}
def eval_expr(node):
"""遞迴解析 AST 節點來計算運算式結果"""
if isinstance(node, ast.Constant): # 數字
return node.value
elif isinstance(node, ast.BinOp): # 二元運算 (例如 a + b)
return operators[type(node.op)](eval_expr(node.left), eval_expr(node.right))
elif isinstance(node, ast.UnaryOp): # 一元運算 (例如 -a)
return operators[type(node.op)](eval_expr(node.operand))
else:
raise TypeError(f"不支援的運算式類型: {type(node)}")
def calculate(expression):
try:
# 將字串解析為抽象語法樹
node = ast.parse(expression, mode='eval')
return eval_expr(node.body)
except ZeroDivisionError:
return "錯誤:除數不能為零"
except Exception as e:
return f"運算式格式錯誤 ({e})"
if __name__ == "__main__":
print("=== 安全數學運算式計算機 ===")
print("支援的運算:+, -, *, /, ** (次方)")
print("輸入 'exit' 即可離開程式。\n")
while True:
expr = input("請輸入運算式 (例如: 3 + 5 * 2 ** 2):")
if expr.lower() == 'exit':
print("感謝使用,再見!")
break
result = calculate(expr)
print(f"計算結果: {result}\n")










留言
張貼留言