【小甲鱼Python】字典:当索引不好用时2&&课后作业

笔记

再谈字典

 与序列类型的区别:序列只能用索引值调用其中的元素,如果索引值越界了会报错。而字典通过键来调用,即便定义字典时没有设置该键,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('输入指令错误,请重新输入')

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值