You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

关键修复点说明

  1. 文件读写分离:用write_equation和read_history两个函数分别处理写入和读取,读取时用"r"模式打开文件,自动处理文件不存在的情况。
  2. 替换递归为循环:用while True实现程序持续运行,避免递归深度问题。
  3. 提取重复逻辑:将写入文件的逻辑封装成函数,减少代码冗余。
  4. 异常处理:捕获非数字输入、除零错误,提升程序稳定性。
  5. 用户体验优化:增加退出选项,输入验证更友好,历史记录打印格式清晰。

内容的提问来源于stack exchange,提问作者Will Harris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 14:43:34