本文介绍如何通过操作符字典映射(`operator` 模块)与结构化异常处理,将冗长的条件分支计算器重构为简洁、可扩展、易维护的版本。
传统计算器实现常依赖大量重复的 if/elif 分支,导致代码冗余、难以扩展且可读性差。核心问题在于:运算逻辑与控制流混杂,输入处理、类型转换、错误检查分散在各分支中。优化方向是「解耦」——将「用户指令」映射到「运算行为」,再统一处理输入与异常。
以下为重构后的专业级实现:
import operator
# 运算符字典映射:键为命令名,值为对应函数对象
FMAP = {
"add": operator.add,
"sub": operator.sub,
"mul": operator.mul,
"div": operator.truediv,
}
def get_prompt():
"""动态生成选项提示,避免硬编码"""
ops = list(FMAP.keys())
return f"Enter '{ops[0]}'" + "".join(f", '{op}'" for op in ops[1:-1]) + f" or '{ops[-1]}': "
# 使用海象运算符(:=)实现简洁的循环输入
while calc := input(get_prompt()).strip():
if func := FMAP.get(calc):
try:
x = float(input("Enter value for x: "))
y = float(input("Enter value for y: "))
print("Result:", func(x, y))
except ValueError:
print("Error: Please enter valid numbers.")
except ZeroDivisionError:
print("Error: Division by zero is not allowed.")
else:
print("Unrecognised operation. Try again.")
✅ 关键优化点说明: