Python计算器代码优化及历史记录读取功能实现求助
代码点评与修复方案
现有代码存在的问题
- 文件操作错误:以
"a"(追加)模式打开的文件仅支持写入,无法读取;且直接打印文件对象sum_file只会输出对象标识,不会显示文件内容,sum_file.read还缺少调用括号。 - 递归调用风险:用户选择"N"时递归调用
calculate(),多次操作后会触发递归深度超限错误。 - 重复代码冗余:加减乘除分支的打印、写入逻辑高度重复,可复用性差。
- 异常未处理:除法时输入0会触发
ZeroDivisionError,输入非数字会触发ValueError,程序直接崩溃。 - 文件未及时刷新/关闭:用
open()直接打开文件未手动关闭,可能导致缓冲区内容未写入磁盘,读取不到最新记录。
修复后的完整代码
def write_equation(equation_str): # 用with语句自动管理文件,确保写入后关闭 with open("equations.txt", "a", encoding="utf-8") as f: f.write(f"{equation_str}\n") def read_history(): # 读取历史记录,文件不存在时捕获异常 try: with open("equations.txt", "r", encoding="utf-8") as f: history = f.read() if history: print("\n=== 计算历史记录 ===") print(history) else: print("\n暂无计算记录") except FileNotFoundError: print("\n暂无计算记录") def calculate(): while True: math_op = input(''' 请选择要执行的运算: + 加法 - 减法 * 乘法 / 除法 输入q退出程序 ''').strip() if math_op.lower() == "q": print("程序已退出") break # 验证运算符有效性 if math_op not in ["+", "-", "*", "/"]: print("无效运算符,请重新输入") continue # 处理数字输入,捕获非数字异常 try: number1 = float(input("请输入第一个数字:")) number2 = float(input("请输入第二个数字:")) except ValueError: print("输入的不是有效数字,请重新输入") continue # 计算并生成运算字符串 try: if math_op == "+": result = number1 + number2 elif math_op == "-": result = number1 - number2 elif math_op == "*": result = number1 * number2 elif math_op == "/": if number2 == 0: raise ZeroDivisionError result = number1 / number2 equation_str = f"{number1} {math_op} {number2} = {result}" print(f"\n计算结果:{equation_str}") write_equation(equation_str) except ZeroDivisionError: print("错误:除数不能为0") continue # 查询历史记录 while True: calc_history = input("\n是否查看计算历史?(Y/N):").strip().upper() if calc_history == "Y": read_history() break elif calc_history == "N": break else: print("请输入有效的选项Y/N") if __name__ == "__main__": calculate()
关键修复点说明
- 文件读写分离:用
write_equation和read_history两个函数分别处理写入和读取,读取时用"r"模式打开文件,自动处理文件不存在的情况。 - 替换递归为循环:用
while True实现程序持续运行,避免递归深度问题。 - 提取重复逻辑:将写入文件的逻辑封装成函数,减少代码冗余。
- 异常处理:捕获非数字输入、除零错误,提升程序稳定性。
- 用户体验优化:增加退出选项,输入验证更友好,历史记录打印格式清晰。
内容的提问来源于stack exchange,提问作者Will Harris
相关产品推荐
相关产品推荐

