7. 实现用户的历史记录功能

本文介绍如何在Python中为一个简单的猜数字游戏中添加历史记录功能。利用collections.deque作为双端循环队列存储历史记录,并通过pickle模块将记录持久化到硬盘,以便在程序重启后仍能查看历史猜数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

例如,很多应用程序都有浏览用户的历史记录的功能:

  1. 浏览器可以查看最近访问过的网页。
  2. 视频播放器可以查看最近播放过的视频文件。
  3. Shell可以查看用户输入过的命令。

要求:现在制作一个简单的猜数字游戏,添加历史记录功能,显示用户最近猜过的数字。

解决方案:

使用容量为n的队列存储历史记录。使用标准库中collections中的deque,它是一个双端循环队列;再使用pickle模块将历史记录存储到硬盘,以便下次启动使用。


  • 对于deque()函数:
deque([iterable[, maxlen]])

deque()函数提供了两端都可以操作的序列,在序列的前后你都可以执行添加或删除操作。maxlen为队列容量。

  • 对于isdigit()方法:

isdigit()方法用来检测字符串是否只由数字组成。如果字符串只包含数字则返回True,否则返回False。

  • 对于append()方法:

append()方法用于在列表末尾添加新的对象,即右端入列;appendleft()方法用于在列表开头添加新的对象,即左端入列。

与之类似的还有pop()方法,pop()方法用于在列表末尾取出新的对象,即右端出列;popleft()方法用于在列表开头取出新的对象,即左端出列。

  • 对于pickle模块:
pickle.dump(obj, file, protocol, fix_imports)

pickle.load(file, fix_imports, encoding, errors)

pickle模块以二进制形式实现基本的数据序列和反序列化。通过pickle模块的序列化操作pickle.dump()方法能够将程序中运行的对象信息保存到文件中去,永久存储;通过pickle模块的反序列化操作pickle.load()方法能够从文件中创建上一次程序保存的对象。


  • 方案示例:
from random import randint
from collections import deque

def guess(n, k):
    if n == k:
        print('猜对了,这个数字是%d' % k)
        return True
    
    if n < k:
        print('猜错了,比%d小' % k)
    elif n > k:
        print('猜错了,比%d大' % k)
    return False

def main():
    n = randint(1, 100)
    i = 1
    hq = deque([], 5)
    while True:
        line = input('[%d] 请输入一个数字:' % i)
        if line.isdigit():
            k = int(line)
            hq.append(k)
            i += 1
            if guess(n, k):
                break
        elif line == 'quit':
            break
        elif line == 'h?':
            print(list(hq))

if __name__ == '__main__':
    main()

结果:

[1] 请输入一个数字:7
猜错了,比7大
[2] 请输入一个数字:11
猜错了,比11大
[3] 请输入一个数字:89
猜错了,比89小
[4] 请输入一个数字:77
猜错了,比77大
[5] 请输入一个数字:56
猜错了,比56大
[6] 请输入一个数字:h?
[7, 11, 89, 77, 56]

这种方式不够完美,因为双端队列存储于内存中,即退出后历史记录消失。

from random import randint
from collections import deque
import pickle

def guess(n, k):
    if n == k:
        print('猜对了,这个数字是%d' % k)
        return True
    
    if n < k:
        print('猜错了,比%d小' % k)
    elif n > k:
        print('猜错了,比%d大' % k)
    return False

def main():
    n = randint(1, 100)
    i = 1
    hq = deque([], 5)
    while True:
        line = input('[%d] 请输入一个数字:' % i)
        if line.isdigit():
            k = int(line)
            hq.append(k)
            pickle.dump(hq, open('save.pkl', 'wb'))
            i += 1
            if guess(n, k):
                break
        elif line == 'quit':
            break
        elif line == 'h?':
            hq2 = pickle.load(open('save.pkl', 'rb'))
            print(list(hq2))

if __name__ == '__main__':
    main()

结果:

[1] 请输入一个数字:11
猜错了,比11大
[2] 请输入一个数字:45
猜错了,比45小
[3] 请输入一个数字:98
猜错了,比98小
[4] 请输入一个数字:34
猜错了,比34大
[5] 请输入一个数字:63
猜错了,比63小
[6] 请输入一个数字:40
猜错了,比40小
[7] 请输入一个数字:h?
[45, 98, 34, 63, 40]
[7] 请输入一个数字:quit
PS E:\Python practice> python -u "e:\Python practice\twenty-one\guess.py"
[1] 请输入一个数字:h?
[45, 98, 34, 63, 40]

可以看到,重新运行该程序,仍然可以查看到历史记录。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值