无名路 发表于 2026-4-18 11:44:43

自制计算器

import pickle

if input("是否初始化?(是)") == "是":
    with open("history.txt","wb") as f:
      pickle.dump([],f)
      print("好了")
lst = []
while True:
    expr = input(">>>")
    if expr == "":
      print("Bye!")
      break
    elif expr == "history":
      with open("history.txt","rb") as f:
            print('\n'.join(pickle.load(f)))
    elif expr == "clear":
      with open("history.txt","wb") as f:
            pickle.dump([],f)
            lst = []
            print("已清空")
    else:
      try:
            with open("history.txt","rb") as f:
                lst = pickle.load(f)
            print(eval(expr))
            with open("history.txt","wb") as f:
                lst.append(str(expr)+"="+str(eval(expr)))
                pickle.dump(lst,f)
      except ZeroDivisionError:
            print("NaN")
      except:
            print("Error")

FishC 发表于 2026-4-18 11:45:36

我看你的计算器程序有几个地方需要完善:

1. pickle.dump() 函数的第一个参数应该是要保存的数据,不能为空
2. lst 变量需要先定义
3. 还需要考虑文件不存在的情况

修改后的完整代码:


import pickle
import os

# 检查文件是否存在,如果不存在或用户选择初始化,则创建空列表
if not os.path.exists("history.txt") or input("是否初始化?(是)") == "是":
    with open("history.txt","wb") as f:
      pickle.dump([], f)
      print("好了")

# 加载历史记录
with open("history.txt","rb") as f:
    lst = pickle.load(f)

while True:
    expr = input(">>>")
    if expr == "":
      print("Bye!")
      break
    elif expr == "history":
      if lst:# 如果历史记录不为空
            print('\n'.join(lst))
      else:
            print("历史记录为空")
    elif expr == "clear":
      lst = []# 清空内存中的列表
      with open("history.txt","wb") as f:
            pickle.dump([], f)# 清空文件
      print("已清空")
    else:
      try:
            result = eval(expr)
            print(result)
            
            # 记录计算历史
            lst.append(str(expr)+"="+str(result))
            
            # 保存到文件
            with open("history.txt","wb") as f:
                pickle.dump(lst, f)
      except ZeroDivisionError:
            print("NaN")
      except:
            print("Error")


主要修改说明:

1. 添加了 import os 来检查文件是否存在
2. pickle.dump() 的第一个参数填入了空列表 []/backcolor]
3. 在循环前先加载历史记录到 lst 变量
4. 修改了异常处理,使用临时变量保存计算结果
5. 添加了对空历史记录的判断

这个计算器可以:
- 输入数学表达式进行计算
- 输入 history 查看计算历史
- 输入 clear 清空历史记录
- 直接按回车退出程序

注意:使用 eval() 函数有一定安全风险,在实际应用中应该对输入进行验证或使用其他更安全的方法。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

空python 发表于 2026-4-18 11:53:38

学习了,快能看明白了
页: [1]
查看完整版本: 自制计算器