============ CH26 homework ============
0 Python的字典是否支持一键(Key)多值(Vaule)?
Answer: 不支持,见后测试代码
>>> a = dict(one = 1, two = 2, three = 3)
>>> b = dict(one = 1, two = 2, three = 3, one = 4)
SyntaxError: keyword argument repeated
1 在字典中,如果试图为一个不存在的键(Key)赋值会怎么样?
Answer: 会加入字典中(也就是创建一个Key)
>>> a['four'] = 4
>>> a
{'four': 4, 'one': 1, 'two': 2, 'three': 3}
2 成员资格运算符(in 和 not in)可以检查一个元素是否在列表中,也可以检查一个键
(Key)是否存在字典中,哪种检查效率更高?为什么?
Answer: 我认为检查Key更快,因为列表中先检查index再核对的值
小甲鱼的答案: 在字典中检查Key是否存在比在序列中检查指定元素是否存在更高效。
原因:字典的原理是使用哈希算法存储,一步到位,不需要使用查找算法进行匹配,因此时间
复杂度是O(1),效率非常高。(关于如何使用如何使用哈希算法存储的具体原理参考[1])
哈希学习
3 Python对键(Key)和值(Vaule)有没有类型限制?
Answer: 哈希对象
小甲鱼的答案: Python对键的要求相对严格一些,要求他们必须是可哈希的对象,不能是可变
类型(包括变量、列表、字典本身等)
但是Python对值是没有任何限制的,他们可以是任意的python对象。
4 请目测下面代码执行后,字典dict1的内容是什么?
>>> dict1.fromkeys((1,2,3), (one, two, three))
>>> dict1.fromkeys((1, 3), '数字')
Answer: {1 : ‘数字’, 3 : ‘数字’}
备注:fromkeys()是创建新的字典,不能用来修改字典!
5 如果你需要将字典dict1 = {1 : ‘one’, 2 : ‘two’, 3 : ‘three’}拷贝到dict2,
你该怎么做?
Answer:
# dict1 = {1 : 'one', 2 : 'two', 3 : 'three'}
# dict2 = dict1.copy()
>>> dict1 = {1 : 'one', 2 : 'two', 3 : 'three'}
>>> dict2 = dict1.copy()
>>> dict2
{1: 'one', 2: 'two', 3: 'three'}
Practice
0 尝试编写一个用户登录程序(这次尝试将功能封装成函数),程序实现如图:
code
# Analysis
# 拆分功能:
# 1、新建用户模块
# 2、登录模块
# 3、显示模块
# 4、字典一个
user_data = {}
def new_user():
idea = '请输入用户名: '
while True:
name = input(idea)
if name in user_data:
idea = '此用户名已经被占用,请重新输入: '
continue
else:
break
passwd = input('请输入密码: ')
user_data[name] = passwd
print('注册成功, 快试试登录吧')
def login():
idea = '请输入用户名: '
while True:
name = input(idea)
if name not in user_data:
idea = '此用户名未注册,请重新输入: '
continue
else:
break
passwd = input('请输入密码: ')
pwd = user_data.get(name)
if passwd == pwd:
print('欢迎进入系统,退出点击右上角的 x !')
else:
print('密码错误!')
def showmenu():
idea = '''
|---- 新建用户(N/n) ----|
|---- 登录账号(E/e) ----|
|---- 退出系统(Q/q) ----|
|---- 输入指令代码: '''
while True:
chosen = False
while not chosen:
choice = input(idea)
if choice not in 'NnEeQq':
print('你输入的指令代码错误,请重新输入!')
continue
else:
chosen = True
if choice == 'q' or choice == 'Q':
break
if choice == 'n' or choice == 'N':
new_user()
if choice == 'e' or choice == 'E':
login()
showmenu()
# Result
|---- 新建用户(N/n) ----|
|---- 登录账号(E/e) ----|
|---- 退出系统(Q/q) ----|
|---- 输入指令代码: N
请输入用户名: Jay
请输入密码: 123456
注册成功, 快试试登录吧
|---- 新建用户(N/n) ----|
|---- 登录账号(E/e) ----|
|---- 退出系统(Q/q) ----|
|---- 输入指令代码: N
请输入用户名: Lisa
请输入密码: 123456
注册成功, 快试试登录吧
|---- 新建用户(N/n) ----|
|---- 登录账号(E/e) ----|
|---- 退出系统(Q/q) ----|
|---- 输入指令代码: S
你输入的指令代码错误,请重新输入!
|---- 新建用户(N/n) ----|
|---- 登录账号(E/e) ----|
|---- 退出系统(Q/q) ----|
|---- 输入指令代码: n
请输入用户名: JJ
请输入密码: 123456
注册成功, 快试试登录吧
|---- 新建用户(N/n) ----|
|---- 登录账号(E/e) ----|
|---- 退出系统(Q/q) ----|
|---- 输入指令代码: E
请输入用户名: Jay
请输入密码: 123456
欢迎进入系统,退出点击右上角的 x !
|---- 新建用户(N/n) ----|
|---- 登录账号(E/e) ----|
|---- 退出系统(Q/q) ----|
|---- 输入指令代码: q
>>>