7.实现⽤户的历史记录功能
素质报告单家长评语例如,很多应⽤程序都有浏览⽤户的历史记录的功能:
1. 浏览器可以查看最近访问过的⽹页。
2. 视频播放器可以查看最近播放过的视频⽂件。
3. Shell可以查看⽤户输⼊过的命令。
要求:现在制作⼀个简单的猜数字游戏,添加历史记录功能,显⽰⽤户最近猜过的数字。
解决⽅案:
使⽤容量为n的队列存储历史记录。使⽤标准库中collections中的deque,它是⼀个双端循环队列;再使⽤pickle模块将历史记录存储到硬盘,以便下次启动使⽤。
对于deque()函数:
夏日连衣裙deque()函数提供了两端都可以操作的序列,在序列的前后你都可以执⾏添加或删除操作。maxlen 为队列容量。
对于isdigit()⽅法:
isdigit()⽅法⽤来检测字符串是否只由数字组成。如果字符串只包含数字则返回True,否则返回False。
对于append()⽅法:
append()⽅法⽤于在列表末尾添加新的对象,即右端⼊列;appendleft()⽅法⽤于在列表开头添加新的对象,即左端⼊列。与之类似的还有pop()⽅法,pop()⽅法⽤于在列表末尾取出新的对象,即右端出列;popleft()⽅法⽤于在列表开头取出新的对象,即左端出列。
对于pickle 模块:
pickle 模块以⼆进制形式实现基本的数据序列和反序列化。通过pickle模块的序列化操作pickle.dump()⽅法能够将程序中运⾏的对象信息保存到⽂件中去,永久存储;通过pickle模块的反序列化操作pickle.load()⽅法能够从⽂件中创建上⼀次程序保存的对象。⽅案⽰例:
deque ([iterable [, maxlen ]])
1pickle .dump (obj , file , protocol , fix_imports )pickle .load (file , fix_imports , encoding , errors )
1
2
3
结果:
这种⽅式不够完美,因为双端队列存储于内存中,即退出后历史记录消失。
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 ()3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33描写雪的句子
[1] 请输⼊⼀个数字:7猜错了,⽐7⼤[2] 请输⼊⼀个数字:11猜错了,⽐11⼤[3] 请输⼊⼀个数字:89猜错了,⽐89⼩[4] 请输⼊⼀个数字:77猜错了,⽐77⼤[5] 请输⼊⼀个数字:56猜错了,⽐56⼤[6] 请输⼊⼀个数字:h?[7, 11, 89, 77, 56]
1
2
3
4
5
6
7
8
9
10
11
12
结果:
可以看到,重新运⾏该程序,仍然可以查看到历史记录。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 ()3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
伤感爱情句子20
21
22
23
24
25
26
27
遗产税28
29
30
31
32
33
34
35
36
[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]
1
2
3
4
5
6
7
8
9
10
11
12
13
战雷主题曲14
15
16
17
18
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论