测试题:
0. Python的字典是否支持一键(Key)多值(Value)?
答:不支持,对相同的键再次赋值会将上一次的值直接覆盖。
1. 在字典中,如果试图为一个不存在的键(Key)赋值会怎样?
答:会自动创建对应的键(Key)并添加相应的值(Value)进去。
2. 成员资格操作符(in和not in)可以检查一个元素是否存在序列中,当然也可以用来检查一个键(Key)是否存在字典中,那么请问哪种的检查效率更高些?为什么?
答:在字典中检查键(Key)是否存在比在序列中检查指定元素是否存在更高效。因为字典的原理是使用哈希算法存储,一步到位,不需要使用查找算法进行匹配,因此时间复杂度是O(1),效率非常高。
3. Python对键(Key)和值(Value)有没有类型限制?
答:Python对键的要求相对要严格一些,要求它们必须是可哈希(Hash)的对象,不能是可变类型(包括变量、列表、字典本身等)。
但是Python对值是没有任何限制的,它们可以是任意的Python对象。
4. 请目测下边代码执行后,字典dict1的内容是什么?
>>> dict1.fromkeys((1, 2, 3), ('one', 'two', 'three'))
>>> dict1.fromkeys((1, 3), '数字')
答:执行完成后,字典dict1的内容是:{1: ‘数字’, 3: ‘数字’}
这里要注意的是,fromkeys方法是直接创建一个新的字典,不要试图使用它来修改一个原有的字典,因为它会直接无情的用把整个字典给覆盖掉。
5. 如果你需要将字典dict1 = {1: ‘one’, 2: ‘two’, 3: ‘three’}拷贝到dict2,你应该怎么做?
答:可以利用字典的copy()方法:dict2 = dict1.copy(),在其他语言转移到Python小伙伴们刚开始可能会习惯性的直接用赋值的方法(dict2 = dict1),这样子做在Python中只是将对象的引用拷贝过去而已。
>>> a = {1:'one', 2:'two', 3:'three'}
>>> b = a.copy()
>>> c = a
>>> c[4] = 'four'
>>> c
{1: 'one', 2: 'two', 3: 'three', 4: 'four'}
>>> a
{1: 'one', 2: 'two', 3: 'three', 4: 'four'}
>>> b
{1: 'one', 2: 'two', 3: 'three'}
动动手:
0. 尝试编写一个用户登录程序(这次尝试将功能封装成函数),程序实现如图:
user_data = {}
def new_user():
prompt = '请输入用户名:'
while True:
name = input(prompt)
if name in user_data:
prompt = '此用户名已经被使用,请重新输入:'
continue
else:
break
passwd = input('请输入密码:')
user_data[name] = passwd
print('注册成功,赶紧试试登录吧^_^')
def old_user():
prompt = '请输入用户名:'
while True:
name = input(prompt)
if name not in user_data:
prompt = '您输入的用户名不存在,请重新输入:'
continue
else:
break
passwd = input('请输入密码:')
pwd = user_data.get(name)
if passwd == pwd:
print('欢迎进入XXOO系统,请点右上角的X结束程序!')
else:
print('密码错误!')
def showmenu():
prompt = '''
|--- 新建用户:N/n ---|
|--- 登录账号:E/e ---|
|--- 推出程序:Q/q ---|
|--- 请输入指令代码:'''
while True:
chosen = False
while not chosen:
choice = input(prompt)
if choice not in 'NnEeQq':
print('您输入的指令代码错误,请重新输入:')
else:
chosen = True
if choice == 'q' or choice == 'Q':
break
if choice == 'n' or choice == 'N':
new_user()
if choice == 'e' or choice == 'E':
old_user()
showmenu()