7. 实现用户的历史记录功能
例如,很多应用程序都有浏览用户的历史记录的功能:
- 浏览器可以查看最近访问过的网页。
- 视频播放器可以查看最近播放过的视频文件。
- 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 dequedef guess(n, k):if n == k:print('猜对了,这个数字是%d' % k)return Trueif n < k:print('猜错了,比%d小' % k)elif n > k:print('猜错了,比%d大' % k)return Falsedef main():n = randint(1, 100)i = 1hq = deque([], 5)while True:line = input('[%d] 请输入一个数字:' % i)if line.isdigit():k = int(line)hq.append(k)i += 1if guess(n, k):breakelif line == 'quit':breakelif 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 pickledef guess(n, k):if n == k:print('猜对了,这个数字是%d' % k)return Trueif n < k:print('猜错了,比%d小' % k)elif n > k:print('猜错了,比%d大' % k)return Falsedef main():n = randint(1, 100)i = 1hq = 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 += 1if guess(n, k):breakelif line == 'quit':breakelif 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]
可以看到,重新运行该程序,仍然可以查看到历史记录。
7. 实现用户的历史记录功能相关推荐
- 5、如何快速找到多个字典中的公共键(key) 6 如何让字典保持有序 7 如何实现用户的历史记录功能(最多n条)...
5.如何快速找到多个字典中的公共键(key) from random import randint,sample #随机取数 # a = sample("ABCDEF",randi ...
- 微信小程序显示用户搜索历史记录功能实现
效果是点击首页输入框跳转到搜索页面,用户搜索后将搜索的内容在历史搜索中展示 如下图所示 首页输入框布局和样式这里我就不展示了 js就是点击跳转页面 历史搜索记录模块wxml <view clas ...
- win10计算机记录,启用Windows 10计算器中的历史记录功能 | MOS86
点击此处修复Windows错误并提高系统性能 Windows 10中的计算器应用程序看起来很简单,但功能尚不强大,因为它包含一些标准的,科学的和编程的模式以及单位转换器.它成为准备账单,转换食谱或其他 ...
- 搜集访问网页历史记录软件_微软宣布OneDrive版本历史记录功能抵达Win10和macOS客户端版...
微软旗下的云存储服务 OneDrive 此前已经提供历史版本功能,即不同编辑版本保留以便用户有需要的时候恢复.不过此前该功能仅支持网页版使用因此操作上多有不变,尤其是常用文档可能每次都得访问网页版查看 ...
- java搜索页面历史记录,使用JS location实现搜索框历史记录功能
首先,来看下效果图(样式什么的就不必吐槽了哈) html代码 搜索记录: //用于保存记录信息 css代码 * { margin: 0; padding: 0; } input { border: 0 ...
- unity制作一个可以自由滑动收缩的历史记录功能。
公司在做一款模拟经营类的卖车游戏,需要一个简单的历史记录功能,放在左上角,记录最近20条的收入/支出记录.超过2秒不动则收起.收起时展示最近的一个消息记录. 用到的组件是ScrollView,使用方法 ...
- java实现用户登录注册功能(用集合框架来实现)
需求:实现用户登录注册功能(用集合框架来实现) 分析: A:需求的类和接口 1.用户类 UserBean 2.用户操作方法接口和实现类 UserDao UserDaoImpl 3.测试类 UserTe ...
- Centos6.4 为用户添加sudo功能
sudo即super user do,以超级管理员的方式运行命令.使用时,只需在命令最前面加上sudo即可. 要为用户添加sudo功能,需要修改sudo的配置文件: vi /etc/sudoers ( ...
- java wed登录面 代码_JavaWeb实现用户登录注册功能实例代码(基于Servlet+JSP+JavaBean模式)...
下面通过通过图文并茂的方式给大家介绍JavaWeb实现用户登录注册功能实例代码,一起看看吧. 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBea ...
最新文章
- Windows Server 2012 R2 WSUS-13:部署二级WSUS
- 网络推广——网络推广专员面对网站收录异常要学会多角度分析
- git cherry-pick用法
- 201671010117 2016-2017-2 《Java程序设计》Java第二周学习心得
- dotnet core webapi +vue 搭建前后端完全分离web架构(一)
- java正则表达式面试_【Java面试宝典】正则表达式
- 互信息python代码_转:标准化互信息NMI计算步骤及其Python实现
- 软考高项--项目管理概述
- 《缠中说禅108课》56:530 印花税当日行情图解
- 如何评价知乎?中文版Quora的商业化道路为何如此曲折?
- java模拟新浪微博用户注册
- 如何轻松关闭华为云中的服务和资源
- 软考中项第三章 信息系统集成专业知识
- 使用bat批量删除修改子目录文件名后缀,超简单
- Response设置响应数据功能介绍及重定向
- 【笔记】 数字集成电路设计(一)
- 学习笔记(28):MATLAB基础入门课程-乘方运算
- Android实战简易教程-第三十九枪(第三方短信验证平台Mob和验证码自动填入功能结合实例)
- 基于高德地图开发 Web 应用
- SQL 笔记总结-转载