字典与递归函数是使用中重要的知识点,现重新回顾了字典的相关内容。
说到字典想必大家小学时候都用到,记性中的现代汉语字典、新华字典,我们在用的时候是在索引页找到我们要找的内容,比如“好”,等找到之后,翻到对应的页码查看解释。在这里面说到的字典操作逻辑其实是一样的。
一、字典的说明:
首先在程序里面字典主要是用key(键值)与value(内容值)的组成来表示,这是固定搭配。比如用字典表示我的个人信息,代码如下
information = {"name":"Oliver","age":25,"sex":"男","phone":13711234567}
运行代码查看:可以运行。下面我们就分析下里面的信息:
然后我们再好好看一下这些信息,我发现刚才定义的key值怎么都是字符串,然后value值可以是字符串也可以是数字,难道别的数据类型等不可以嘛,那我们继续多写几个字典看看。修改代码如下:
information = {"name":"Oliver","age":25,"sex":"男","phone":13711234567}
information = {"name":"Oliver",age:25,"sex":"男","phone":13711234567}
information = {"name":"Oliver","age":25,1:"男","phone":13711234567}
information = {[name]:"Oliver","age":25,"sex":"男","phone":13711234567}
information = {"name":"Oliver","age":[name,哈哈],"sex":"男","phone":13711234567}
information = {(name):"Oliver","age":25,"sex":"男","phone":13711234567}
information = {"name":"Oliver","age":25,"sex":"男","phone":(13711234567)}
information = {"name":"Oliver","age":25,"sex":"男","phone":{13711234567:1,13711234562:2}}
运行之后为发现有些是报错的,但是有些又是正常的。原来对于key来说类型只能是str(字符串)、int(数字)、couple(元组)。而对于value来说什么类型都可以。
上面是定义一个字典,那是否可以函数创建一个字典呢。查看到有个内置函数dict(),可以这样自主创建。下面我们试着写写看看,代码如下:
list = ("大明","二明","张三","李四","王五")
dict00 = dict(a = 1,b=2,c=3)
dict01 = dict(zip(range(5),list))
dict02 = dict([(1,1),(2,2),(3,3)])
运行效果如下:发现,如果是用dict()内至的函数可以简单快速的创建我们想要的字典。
二、对应增删改查
现在我们可以自己定义一个字典或者创建一个我们想要的字典了,那业务场景肯定存在着对字典里面元素的增删改查等操作。
增加:
当我们要增加字典中的元素时,逻辑上我们应该得先知道我们要增加的哪个字典,然后才可以增加,就像吃饭,我们饿了要吃饭,可是得知道去哪家店点什么菜是吧。否则也不知道吃什么。那代码如下:
information = {"name":"Oliver","age":25,"sex":"男","phone":13711234567}
information["height"] = 177
information["weight"] = 76
运行效果如下:这就增加了字典元素,仔细想想,这个是一个个添加,如果我需要添加几百上千个元素的话,那我岂不是要疯了。那如何批量增加呢,我暂时想到的是遍历来一个个添加,代码如下:
Message = {"name":"Oliver","age":25,"sex":"男","phone":13711234567}
add = {"height":177,"weight":76}
for num in add:
Message[num] = add[num]
print(Message)
运行程序如下:
删除:
对于删除来说跟增加差不多。删除有直接删掉字典、删除字典中的所有所有元素、提取某个元素并删除。代码如下:
Message = {"name":"Oliver","age":25,"sex":"男","phone":13711234567}
del Message["name"] #删除key为name的值
Message = {"name":"Oliver","age":25,"sex":"男","phone":13711234567}
del Message #删除整个字典
Message = {"name":"Oliver","age":25,"sex":"男","phone":13711234567}
Message.clear() #删除所有元素
Message = {"name":"Oliver","age":25,"sex":"男","phone":13711234567}
Message.pop("name") #获取某个值并删除
代码运行如下:感觉在这里面用的比较多的会是pop(),比如我们抽签,当我们抽到某个签的时候,应该先获取这个签的信息,然后还要在原先的签盒子里面拿掉这个签等等场景。
修改:
修改字典信息,我们可以理解为就是有一个新的字典,这个新的字典的元素覆盖原先的字典信息。我们可以直接update()内置函数即可,不用记别的内容。代码如下:
information = {"name":"Oliver","age":25,"sex":"男","phone":13711234567}
Message = {"phone":999,"weight":177,"height":76}
information.update(Message)
运行效果如下:我们发现key--phone已经变成999了,而且后面也加上了身高跟体重。所以这个update就可以包含所有修改的可能性了。
查询
当我们有字典信息,需要被人为的调用查询。对于场景来说,我们基本是知道key值,来查找value值。那我们可以试着尝试写下,其实这个在第一个批量增加的时候就有提到过,代码如下:
information = {"name":"Oliver","age":25,"sex":"男","phone":13711234567}
information["name"]
information["age"]
运行效果如下
三、小案例说明:
场景是我们现在有一个考试成绩查询系统,在这系统里面有我们学生的考试成绩信息,需要有学生信息、考试科目、考试成绩的增删改查。
print("欢迎登陆学生成绩查询系统")
info = {
"张三":
{
"语文":89,
"数学":90,
"英语":60
},
"李四":
{
"语文":66,
"数学":66,
"英语":66
},
"王五":
{
"语文":33,
"数学":33,
"英语":33
}
}
#首先做一个登录校验的一个函数
def act():
usename = input("请输入您的姓名")
if usename not in info:
print("您的身份不不正确,请重新输入您的姓名")
return act()
else:
print("欢迎{0}登陆学生成绩查询系统".format(usename))
#在做一个用户行为操作的函数
def oper():
operation = int(input("请输入您要对学生信息、考试科目、考试成绩的操作,1:增加;2:删除;3:修改;4:查询;5:退出系统"))
if operation == 1:
return student()
elif operation ==2:
return delete()
elif operation ==3:
return update()
elif operation ==4:
return check()
elif operation ==5:
exit()
else:
print("填写信息有误哦!")
return oper()
#做用户增加的函数
#(1)首先是确认是在已有的学生信息增加学科还是新增加的学生
def student():
global stuname
stuname = input("请输入要增加的学生姓名->")
if stuname in info:
print("已有次学生的信息,请直接输入增加学科信息")
sure = int(input("是否需要添加学科信息》1:需要,2:退出"))
if sure == 1:
return addscore()
else:
return oper()
else:
print("已创建学生信息,请输入需要增加的学科信息")
sure = int(input("是否需要添加学科信息》1:需要,2:退出"))
if sure == 1:
return addscore()
else:
return oper()
#(2)现这添加需要增加的学科与成绩信息
def addscore():
print("""------------------""")
global object
object = {}
n = 1
while n:
stuobject = input("请输入需要增加的科目》")
stuscore = int(input("请输入{0}的考试成绩》".format(stuobject)))
object[stuobject] = stuobject
info[stuname] = object
confirm = input("请确认是否继续添加信息,继续输入是,退出输入否》")
if confirm != "是" or confirm != "否":
pass
elif confirm == "是":
continue
elif confirm == "否":
return oper()
#做一个用户查询的函数
def check():
stuname01 =input("请输入需要查询的学生姓名》")
if stuname01 not in info:
print("查询信息不存在,请重新输入学生姓名")
return check()
else:
print("{0}的成绩信息如下:{1}".format(stuname01,info[stuname01]))
return oper()
#做一个用户修改的函数
def update():
confirm = input("请确认是否修改》")
object01 ={}
name = input("请输入学生姓名》")
n = 1
while n:
stuobject = input("请输入需要修改的学科》")
stuscore = int(input("请输入{0}的考试成绩》".format(stuobject)))
object[stuobject] = stuobject
info.update(object)
confirm = input("请确认是否继续修改信息,继续输入是,退出输入否》")
if confirm != "是" or confirm != "否":
pass
elif confirm == "是":
continue
elif confirm == "否":
return oper( )
#做一个删除的函数
def delete():
delname = input("请输入需要删除的学生名称》")
num = int(input("删除需谨慎,请确认是删除该1,所有学科成绩还,2,某门课程成绩"))
if num !=1 and num !=2:
pass
if num ==1:
del info[delname]
else:
delobject = input("请输入需要删除的学科")
del info[delname][delobject]
sure = input("请确认是否需要继续操作,1》继续,2》退出")
if sure !=1 and sure !=2:
pass
if sure ==1:
return delete()
else:
return oper()
问题构想:
初步代码写完了,但是看起来有些傻瓜式,不够精简。现在想到三个问题:
1、有些信息都是重复的,比如有很多的if判断,当用户操作完一遍之后都要问一下是否继续操作,可能就会出现我们想要键入之外的值,那这个地方如果做成枚举类,只能有我们想要的,相对就会少一个类别判断。
2、还有就是在增删改查中用户操作不可能操作一次就完事儿了,势必存在呢多次操作,如果在代码中很好的嵌入while或者递归回调函数,这就解决了多次操作问题。
3、我们看下来总感觉有很多东西是重复的,是否可以规整在一起形成一种父子类呢,从而让代码看起来更简便与直接呢,我现在想到的是,比如每次函数调用的时候都要用户键入学生姓名,是否可以把键入学生姓名做成一个父类,子类做成printf输出的字符串不一样呢的区别,这样看起来直接又简洁等。
根据这些问题,看着手痒痒的小伙伴把代码再优化一下吧。
总结:
1、键(Key)必须是唯一的,但值(Value)则不必。值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。
2、内置函数:dict()
用法:
class dict(**kwarg) -------**kwargs -- 关键字
class dict(mapping, **kwarg) ----------mapping -- 元素的容器
class dict(iterable, **kwarg) ---------iterable -- 可迭代对象
3、增加:dict [key] = value
4、删除:del 、dict.clear() 、dict.pop(key)