python核心编程2 第七章 练习
7-4. 建立字典。
给定两个长度相同的列表,比如说,列表[1, 2, 3,...]和['abc', 'def','ghi',...],用这两个列表里的所有数据组成一个字典,像这样:{1:'abc', 2: 'def', 3: 'ghi',...}
listdict = dict(zip([1,2,3], ['abc','def','ghi']))
print(listdict)
7–5. userpw2.py.
下面的问题和例题7.1 中管理名字-密码的键值对数据的程序有关。
(a)修改那个脚本,使它能记录用户上次的登录日期和时间(用time 模块),并与用户密码一起保存起来。程序的界面有要求用户输入用户名和密码的提示。无论户名是否成功登录,都应有提示,在户名成功登录后,应更新相应用户的上次登录时间戳。如果本次登录与上次登录在时间上相差不超过4 个小时,则通知该用户: “You already logged in at: <last_ login_timestamp>.”
(b) 添加一个“管理”菜单,其中有以下两项:(1)删除一个用户 (2)显示系统中所有用户的名字和他们的密码的清单。
(c) 口令目前没有加密。请添加一段对口令加密的代码(请参考crypt, rotor, 或其它加密模块)
(d) 为程序添加图形界面,例如,用Tkinter 写。
(e) 要求用户名不区分大小写。
(f) 加强对用户名的限制,不允许符号和空白符。
(g)合并“新用户”和“老用户”两个选项。如果一个新用户试图用一个不存在的用户名登录,
询问该用户是否是新用户,如果回答是肯定的,就创建该帐户。否则,按照老用户的方式登录。
import time
import hashlib
from datetime import datetime db = {} def newuser():
"""注册"""
value = []
prompt = 'login desired: '
while True:
name = input(prompt).lower()
if not name.isalnum() and '' in name:
print('name format error')
continue
else:
if name in db:
prompt = 'name taken, try another: '
continue
else:
break
pwd = input('login password desired:')
m = hashlib.md5()
m.update(pwd.encode(encoding='utf-8'))
value.append(m.hexdigest())
value.append(datetime.now())
value.append(time.time())
db[name] = value
print('new user is %s, register time is %s' % (name, db[name][1])) def olduser():
"""登录"""
name = input('Username:').lower()
pwd = input('Password:')
m = hashlib.md5()
m.update(pwd.encode(encoding='utf-8'))
passwd = db.get(name)
if passwd[0] == m.hexdigest():
newtimestamp = time.time()
newtime = datetime.now()
if newtimestamp - db[name][2] < 14400:
print('You already logged in at %s:' % db[name][1])
else:
passwd[1] = newtime
print('Welcome back %s, login time is %s' % (name, passwd[1]))
else:
print('Login incorrect') def deluser():
"""删除"""
print(db)
name = input('Input a user name to remove:').lower()
if name in db:
db.pop(name)
print("Done")
else:
print('Input error') def getuserpwd():
"""查询"""
while True:
name = input('login name desired:').lower()
if not name.isalnum() and '' in name:
print('name format error')
continue
else:
if name not in db:
print('User name is not in db')
answer = input('register a new user? y/n').lower()
if 'y' == answer:
newuser()
break
elif 'n' == answer:
break
else:
print('user name is already in db')
olduser()
break def removeuser():
"""删除"""
print(db)
name = input('Input a user name to remove:').lower()
if name in db:
db.pop(name)
else:
print('Input error') def getuser():
"""查询"""
while True:
name = input('login name desired:').lower()
if not name.isalnum() and '' in name:
print('name format error')
continue
else:
if name not in db:
print('User name is not in db')
answer = input('register a new user? y/n').lower()
if 'y' == answer:
newuser()
break
elif 'n' == answer:
break
else:
print('user name is already in db')
olduser()
break def showmenu():
"""总菜单"""
prompt = """
(N)ew User Login
(E)xisting User Login
(G)et user
(R)emove a existing user
(Q)uit Enter choice: """ done = False
while not done: chosen = False
while not chosen:
try:
choice = input(prompt).strip()[0].lower()
except (EOFError, KeyboardInterrupt):
choice = 'q'
print('\nYou picked: [%s]' % choice)
if choice not in 'negrq':
print('invalid option, try again') else:
chosen = True if choice == 'q': done = True
if choice == 'n': newuser()
if choice == 'e': olduser()
if choice == 'g': getuser()
if choice == 'r': removeuser() if __name__ == '__main__':
showmenu()
7-7. 颠倒字典中的键和值。用一个字典做输入,输出另一个字典,用前者的键做值,前者的值做键。
dict_sort = {1: 'a', 2: 'b'}
dictreverse = {}
for key, value in dict_sort.items():
dictreverse[value] = key
print(dictreverse)
7-8. 人力资源。
创建一个简单的雇员姓名和编号的程序。让用户输入一组雇员姓名和编号。你的程序可以提供按照姓名排序输出的功能,雇员姓名显示在前面,后面是对应的雇员编号。附加题:添加一项功能,按照雇员编号的顺序输出数据。
name_number = {}
while True:
name = input("输入姓名:")
number = input("输入编号:") name_number[name] = number
for name, number in name_number.items():
print(name, ':', number)
print(number, ':', name)
7–13. 随机数。
修改练习5-17 的代码:使用random 模块中的randint()或randrange()方法生成一个随机数集合:从0 到9(包括9)中随机选择,生成1 到10 个随机数。这些数字组成集合A(A 可以是可变集合,也可以不是)。同理,按此方法生成集合B。每次新生成集合A 和B 后,显示结果 A | B 和 A & B
7-14. 用户验证。修改前面的练习,要求用户输入A|B和A&B的结果,并告诉用户的答案是否正确,而不是将A|B和A&B的结果直接显示出来。如果用户回答错误,允许他修改解决方案,然后重新验证用户输入的答案。如果用户三次提交的答案均不正确,程序将显示正确结果。附加题:运用你关于集合的知识,创建某个集合的潜在子集,并询问用户此潜在子集是否真是该集合的子集,要求和主程序一样有显示更正和答案的功能。
import random
A = []
B = []
for i in range(random.randint(1,11)):
A.append(random.randint(0, 9))
B.append(random.randint(0, 9))
print('A:', set(A))
print('B:', set(B))
C = set(A) | set(B)
D = set(A) & set(B) i = 0
while i <= 3: union = set(input('Union: '))
intersection = set(input('Intersection: '))
if union == C:
print('回答正确')
if intersection == D:
print('回答正确')
else:
print('回答错误')
i += 1
python核心编程2 第七章 练习的更多相关文章
- 《Python核心编程》 第七章 映射和集合类型 - 习题
课后习题 7–1. 字典方法.哪个字典方法可以用来把两个字典合并到一起? 答: dict1 = {' :' python' } dict2 = {' :"hello" } dict ...
- python核心编程2 第十一章 练习
11-2 函数.结合你对练习5-2的解,以便你创建一个带一对相同数字并同时返回它们之和以及产物的结合函数. multiply = lambda x, y: x * y if __name__ == ' ...
- 《Python核心编程》 第六章 序列 - 课后习题
课后习题 6–1.字符串.string 模块中是否有一种字符串方法或者函数可以帮我鉴定一下一个字符串是否是另一个大字符串的一部分? 答:成员关系操作符(in.not in) import string ...
- 《Python核心编程》 第四章 Python对象- 课后习题
练习 4-1. Python对象.与所有Python对象有关的三个属性是什么?请简单的描述一下. 答:身份.类型和值: 身份:每一个对象都有一个唯一的身份标识自己,可以用id()得到. 类型:对象的 ...
- Python核心编程2第四章课后练习
4-1 Python 对象.与所有 Python 对象有关的三个属性是什么?请简单的描述一下. 身份:对象的唯一标识 类型 :对象的类型决定了该对象可以保存什么类型的值 ...
- Python核心编程笔记 第三章
3.1 语句和语法 3.1.1 注释( # ) 3.1.2 继续( \ ) 一般使用换行分隔,也就是说一行一个语句.一行过长的语句可以使用反斜杠( \ ) 分 ...
- 《Python核心编程》第五章:数字
PS:[笔记+代码+图片]在GitHub上持续更新,欢迎star:https://github.com/gdouchufu/Core-Python-Programming 本章大纲 介绍Python支 ...
- python核心编程2 第六章 练习
6-2. 字符串标识符.修改例 6-1 的 idcheck.py 脚本,使之可以检测长度为一的标识符,并且可以识别 Python 关键字,对后一个要求,你可以使用 keyword 模块(特别是 key ...
- 《Python核心编程》 第五章 数字 - 课后习题
课后习题 5-1 整形. 讲讲 Python 普通整型和长整型的区别. 答:普通整型是绝大多数现代系统都能识别的. Python的长整型类型能表达的数值仅仅与你机器支持的(虚拟)内存大小有关. 5- ...
随机推荐
- sort属性
学习文章---链接 总结笔记 ①sort是Array.prototype的属性, ②如果不写入参数,则按照转换为的字符串的每个字符的unicode位点进行排序, ③如果传入一个比较函数sort(fun ...
- 沙箱模式的chrome浏览器的运行
getUserMedia在chrome 47后已经不可以从非安全源访问(Insecure Origins),但测试搭建apprtc时服务器一般没有添加HTTPS安全验证,chrome就没有权限访问麦克 ...
- javascript实现数据结构: 稀疏矩阵之三元组线性表表示
稀疏矩阵(Sparse Matrix):对于稀疏矩阵,目前还没有一个确切的定义.设矩阵A是一个n*m的矩阵中有s个非零元素,设 δ=s/(n*m),称δ为稀疏因子, 如果某一矩阵的稀疏因子δ满足δ≦ ...
- cordova 开发 ios app 简要流程
1 安装node.js环境 官网: http://nodejs.org/ 点击[install],会下载mac的安装包.正常安装即可 2 安装cordova:npm install -g cordo ...
- c++类模板成员函数报错
类模板成员函数要不就在类模板中实现,要不就和类模板写在同一个文件中. 否则然会出现下面错误: >main.obj : error LNK2019: 无法解析的外部符号 "public: ...
- Centos7安装JDK1.8 Linux64bit
流程一览: 1.下载JDK1.8(jdk-8u11-linux-x64.tar.gz) 2. 解压缩安装 3.配置JAVA_HOME环境变量 4.切换JDK1.8为当前使用的JDK 5.重启,查看安装 ...
- (二)selenium元素定位
selenium定位方法 Selenium提供了8种定位方式. id name class name tag name link text partial link text xpath css se ...
- SSH免密钥互信及企业案例
SSH远程免密码: 原理简述:客户端 创建公钥和私钥,公钥是锁,私钥是自己留在客户端的钥匙. 客户端将公钥(锁)发出到服务端,以后自己就能用客户端本地的私钥进行登陆,不用输入密码! 1.客户端,和服 ...
- 安装OUD报错,unsupported classversion 51.0
查找,错误代码,在一篇博客中看到:补充:后经实例证明,在eclipse中进行开发的时候,build path 中JDK进行类库的编译(就是你使用类在不在这个JDK中),java compiler co ...
- [原]C++ double 小数精度控制
第一种方法:cout<<fixed<<setprecision(20)<<mydouble<<endl; #include <iostream&g ...