例如,很多应用程序都有浏览用户的历史记录的功能:
- 浏览器可以查看最近访问过的网页。
- 视频播放器可以查看最近播放过的视频文件。
- 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]
可以看到,重新运行该程序,仍然可以查看到历史记录。