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

  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 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. 实现用户的历史记录功能相关推荐

  1. 5、如何快速找到多个字典中的公共键(key) 6 如何让字典保持有序 7 如何实现用户的历史记录功能(最多n条)...

    5.如何快速找到多个字典中的公共键(key) from random import randint,sample #随机取数 # a = sample("ABCDEF",randi ...

  2. 微信小程序显示用户搜索历史记录功能实现

    效果是点击首页输入框跳转到搜索页面,用户搜索后将搜索的内容在历史搜索中展示 如下图所示 首页输入框布局和样式这里我就不展示了 js就是点击跳转页面 历史搜索记录模块wxml <view clas ...

  3. win10计算机记录,启用Windows 10计算器中的历史记录功能 | MOS86

    点击此处修复Windows错误并提高系统性能 Windows 10中的计算器应用程序看起来很简单,但功能尚不强大,因为它包含一些标准的,科学的和编程的模式以及单位转换器.它成为准备账单,转换食谱或其他 ...

  4. 搜集访问网页历史记录软件_微软宣布OneDrive版本历史记录功能抵达Win10和macOS客户端版...

    微软旗下的云存储服务 OneDrive 此前已经提供历史版本功能,即不同编辑版本保留以便用户有需要的时候恢复.不过此前该功能仅支持网页版使用因此操作上多有不变,尤其是常用文档可能每次都得访问网页版查看 ...

  5. java搜索页面历史记录,使用JS location实现搜索框历史记录功能

    首先,来看下效果图(样式什么的就不必吐槽了哈) html代码 搜索记录: //用于保存记录信息 css代码 * { margin: 0; padding: 0; } input { border: 0 ...

  6. unity制作一个可以自由滑动收缩的历史记录功能。

    公司在做一款模拟经营类的卖车游戏,需要一个简单的历史记录功能,放在左上角,记录最近20条的收入/支出记录.超过2秒不动则收起.收起时展示最近的一个消息记录. 用到的组件是ScrollView,使用方法 ...

  7. java实现用户登录注册功能(用集合框架来实现)

    需求:实现用户登录注册功能(用集合框架来实现) 分析: A:需求的类和接口 1.用户类 UserBean 2.用户操作方法接口和实现类 UserDao UserDaoImpl 3.测试类 UserTe ...

  8. Centos6.4 为用户添加sudo功能

    sudo即super user do,以超级管理员的方式运行命令.使用时,只需在命令最前面加上sudo即可. 要为用户添加sudo功能,需要修改sudo的配置文件: vi /etc/sudoers ( ...

  9. java wed登录面 代码_JavaWeb实现用户登录注册功能实例代码(基于Servlet+JSP+JavaBean模式)...

    下面通过通过图文并茂的方式给大家介绍JavaWeb实现用户登录注册功能实例代码,一起看看吧. 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBea ...

最新文章

  1. Windows Server 2012 R2 WSUS-13:部署二级WSUS
  2. 网络推广——网络推广专员面对网站收录异常要学会多角度分析
  3. git cherry-pick用法
  4. 201671010117 2016-2017-2 《Java程序设计》Java第二周学习心得
  5. dotnet core webapi +vue 搭建前后端完全分离web架构(一)
  6. java正则表达式面试_【Java面试宝典】正则表达式
  7. 互信息python代码_转:标准化互信息NMI计算步骤及其Python实现
  8. 软考高项--项目管理概述
  9. 《缠中说禅108课》56:530 印花税当日行情图解
  10. 如何评价知乎?中文版Quora的商业化道路为何如此曲折?
  11. java模拟新浪微博用户注册
  12. 如何轻松关闭华为云中的服务和资源
  13. 软考中项第三章 信息系统集成专业知识
  14. 使用bat批量删除修改子目录文件名后缀,超简单
  15. Response设置响应数据功能介绍及重定向
  16. 【笔记】 数字集成电路设计(一)
  17. 学习笔记(28):MATLAB基础入门课程-乘方运算
  18. Android实战简易教程-第三十九枪(第三方短信验证平台Mob和验证码自动填入功能结合实例)
  19. 基于高德地图开发 Web 应用
  20. SQL 笔记总结-转载

热门文章

  1. vim复制多行和删除多行的方法
  2. 智能开关面板行业概览
  3. 易基因|深度综述:表观遗传机制在慢性疼痛中的作用(DNA甲基化+组蛋白修饰+非编码RNA)
  4. 计算机学科——软件工程
  5. Android 常用设计模式
  6. 大泉州网-泉州生活信息第一门户
  7. 辍学程序员改变世界,这个长的像马云的90后少年真要击败扎克伯格
  8. 剧本杀游戏多人互动小程序
  9. 科学计数法转换浮点数【golang】
  10. 小程序接入信用能力,微信花呗来了