笔记
再谈字典
与序列类型的区别:序列只能用索引值调用其中的元素,如果索引值越界了会报错。而字典通过键来调用,即便定义字典时没有设置该键,Python也会自动创建该键而不会报错。
序列类型包括:字符串,元组,列表和范围
dict()不是BIF,是一个工厂函数(类型)。
字典的存储机制:https://fishc.com.cn/thread-45016-1-1.html
fromkeys()
注:dict1.fromkeys()返回的是新的字典,并没有改变dict1是空数组的事实。
keys(),values()和items()
如上图,其功能不难理解,分别打印出键,值和相。
get()
例如:dict1.get(3)会返回键值为3对应的值。若键值不存在,则返回None。
可以通过添加一个参数,使得访问不存在的键值时给出提示:
利用成员资格操作符判断键是否在字典中
检查成员资格时,若数据规模很大,字典检查的效率会明显高于序列类型。
在检查成员资格时,字典查找的是键,而不是值;序列查找的是值(元素),而不是索引。
删除字典中的元素
1.del语句
既可以删除整个字典,也可以只删除某一个相。
dict1 = {1:'one','two':2}
del dict1[1] #删除1:'one'
del dict1['two'] #删除'two':2
del dict1 #删除整个dict1
2.clear()
用于清空字典,使之变成空字典。
例如:
直接使用 dict1 = {}来达到清空字典的目的是十分不严谨的做法,不推荐使用。详见下例:
理论上想达到的效果是a,b都变为空字典,但结果却背道相驰。
3.pop()和popitem()
pop():给定键弹出值
popitem():默认弹出最后一个相
弹出,即把原字典中的对应相删除并返回该相(或该相的值)
例如:
copy()
copy()是浅拷贝,拷贝意味着生成一个新字典,与赋值是不同的。
可用id()查看发现,a和c 与b的地址不同,即b是一个新字典。
setdefault()
update()
课后作业
测试题:
0. Python的字典是否支持一键(Key)多值(Value)?
答:不支持,除非这多个值是用元组或列表括起来的。
1. 在字典中,如果试图为一个不存在的键(Key)赋值会怎样?
答:字典会自动创建该键并赋值。
2. 成员资格操作符(in和not in)可以检查一个元素是否存在序列中,当然也可以用来检查一个键(Key)是否存在字典中,那么请问哪种的检查效率更高些?为什么?
答:当数据规模很大时,字典的检查效率要高于序列的效率。因为字典通过搜索键来直接对应寻找,而序列需要从第一个元素一直遍历。
3. Python对键(Key)和值(Value)有没有类型限制?
答:没有。
4. 请目测下边代码执行后,字典dict1的内容是什么?
>>> dict1.fromkeys((1, 2, 3), ('one', 'two', 'three'))
>>> dict1.fromkeys((1, 3), '数字')
答:
{1:('one', 'two', 'three'),2:('one', 'two', 'three'),3:('one', 'two', 'three')}
{1:'数字',3:'数字'}
5. 如果你需要将字典dict1 = {1: 'one', 2: 'two', 3: 'three'}拷贝到dict2,你应该怎么做?
答:
dict2 = dict1.copy()
动动手:
0. 尝试编写一个用户登录程序(这次尝试将功能封装成函数),程序实现如图:
答:
dict1 = {}
#新建用户
def create():
name = input('请输入用户名:')
while 1:
if name in dict1:
name = input('此用户名已经被使用,请重新输入:')
else:
break
pw = input('请输入密码:')
dict1[name] = pw
print('注册成功,赶紧登录试试吧^_^')
#登陆账号
def enter():
name = input('请输入用户名:')
while 1:
if name not in dict1:
name = input('您输入的用户名不存在,请重新输入:')
else:
break
i = 3
flag = 0 #函数返回值,用于在主程序中检测是否登陆成功
while i:
pw = input('请输入密码:')
if pw == dict1[name]:
print('欢迎进入XXOO系统,请点击右上角的X结束程序!')
flag = 1
break
else:
i -= 1
print('密码错误,还有%d次机会'%i)
return flag
#主程序
while 1:
print('''\n|---新建用户:N/n---|
|---登陆账号:E/e---|
|---退出程序:Q/q---|''')
command = input('|---请输入指令代码:')
if command == 'N' or command == 'n':
create()
elif command == 'E' or command == 'e':
if enter():
break
elif command == 'Q' or command == 'q':
print('请点击确定以退出程序!')
quit()
else:
print('输入指令错误,请重新输入')