Day05

一、数据类型的划分:

        python中的数据类型划分为:

                               可变的数据类型:    list , 字典,set(集合)

                               不可变的数据类型:元组 , int ,bool ,str (字符串是不可变的类型,因为对字符串的修改是创建了一个新的字符串,而不是在原有的字符串的基础上进行改变)    可哈希

二:字典简介

        字典有键值对(键和值)组成,和数据库中的主键有些类似,一个键对应的一个值。

        键:因为一个键确定值,所以键是不能改变的数据类型 (int ,bool ,str,元组) 都可以作为键的类型

        值:字典的值可以是任何类型

      

        优点:字典是无序的,但是字典中的键是有序排列的。而且,字典在查找的时候,在键中优先采用二分法进行查找,所以字典的查找速率很快。

        特点:字典的存储是无序的,有点分布式数据库的意思。

三:字典的创建

        字典的格式:一般用大括号括起来,键于值之间用冒号连接

1 dic = {
2        键1 :值1,
3        键2 : 值2,
4 }

代码演示:

 1 dic = {
 2     "name":["huao","zhao"],
 3     '计科':[{"name":"胡澳",'age':18},
 4           {"name":"胡澳",'age':19}
 5           ],
 6     True:1,
 7     (1,2,3):"胡澳",
 8     2:"二哥"
 9 }
10 print(dic)

 

运行结果:

D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py
{'name': ['huao', 'zhao'], '计科': [{'name': '胡澳', 'age': 18}, {'name': '胡澳', 'age': 19}], True: 1, (1, 2, 3): '胡澳', 2: '二哥'}

进程已结束,退出代码0

解析:字典的创建中,键用了(str, bool,tuple,int )等一系列的不可变的数据类型

           而值得创建则是用了不同得数据类型,任意得数据类型都可以。

四、字典的增删改查

 

         增:

代码演示:

dic = {"name":"胡澳","age":20,"班级":"17级计科六班"}
dic["weigth"] = 120 #如果这个键值对没有的话,会直接添加到字典里面
dic["age"] = 19     #有这个键值对会直接覆盖掉原来的值


'''
 def setdefault(self, *args, **kwargs): # real signature unknown
        """
        Insert key with a value of default if key is not in the dictionary.

        Return the value for key if key is in the dictionary, else default.
        """
        pass
如果键不在字典中,则使用默认值进行插入。
如果键在字典中,则返回键的值,否则直接插入默认值
'''
dic.setdefault('weight') #字典中有weight这个键,但是没有指定值,所以直接用默认值添加(默认值就是None)
dic.setdefault("name","赵润全")
print(dic)

运行结果:

D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py
{'name': '胡澳', 'age': 19, '班级': '17级计科六班', 'weigth': 120, 'weight': None}

进程已结束,退出代码0

分析:字典中的增加的方法大致上和列表差不多。

    删:

  pop(有键,删除并返回删除值。没键,报错):

代码演示:

 1 dic = {"name":"胡澳","age":20,"班级":"17级计科六班"}
 2 '''
 3 def pop(self, k, d=None): # real signature unknown; restored from __doc__
 4         """
 5         D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
 6         If key is not found, d is returned if given, otherwise KeyError is raised
 7         """
 8         pass
 9 找到了就删除并返回被删除的值。没有找到就报错
10 '''
11 dic1 = dic.pop('name')  # pop有返回值。返回的是被删除的键所对应的值。
12 dic2 = dic.pop('weight') #没有找到就报错了
13 print(dic1)

 

 

 

运行结果:

D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py
Traceback (most recent call last):
  File "D:/学习资料/项目/练习/lianxi.py", line 11, in <module>
    dic2 = dic.pop('weight')
KeyError: 'weight'

进程已结束,退出代码1

popitem(随机删除并返回键和值组成的元组,没找到键就进行报错):

代码演示:

 1 dic = {"name":"胡澳","age":20,"班级":"17级计科六班"}
 2 dic.setdefault("weight",60)
 3 '''
 4 def popitem(self): # real signature unknown; restored from __doc__
 5         """
 6         D.popitem() -> (k, v), remove and return some (key, value) pair as a
 7         2-tuple; but raise KeyError if D is empty.
 8         """
 9         pass
10 删除并且返回被删除的键和值。返回的是一个元组,里面包含键值对。
11 如果没有找到键,则会报错。
12 '''
13 print(dic)
14 dic1 = dic.popitem() #随机删除(说着是随机删除,但实际上是删除最后一个)
15 print(dic)
16 print(dic1)

运行截图:

D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py
{'name': '胡澳', 'age': 20, '班级': '17级计科六班', 'weight': 60}
{'name': '胡澳', 'age': 20, '班级': '17级计科六班'}
('weight', 60)

进程已结束,退出代码0

del:

代码演示:

dic = {"name":"胡澳","age":20,"班级":"17级计科六班"}
del dic["name"] 
print(dic)
del dic
print(dic)

运行结果:

D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py
Traceback (most recent call last):
  File "D:/学习资料/项目/练习/lianxi.py", line 5, in <module>
    print(dic)
{'age': 20, '班级': '17级计科六班'}
NameError: name 'dic' is not defined

进程已结束,退出代码1

代码分析:del删除和在列表中的一样。在字典中的删除的时候,直接删除键就行,因为键是对应的映射到值上面的。

clear(直接就是清空字典):

代码演示:

dic = {"name":"胡澳","age":20,"班级":"17级计科六班"}
dic.clear()
print(dic)

运行结果:

D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py
{}

进程已结束,退出代码0

代码分析:运用clear进行删除的时候,完全删除后并不会直接进行报错,而是返回一个空的字符串。

  改:

update(将dic1中的值更新到dic中,没有键的添加,有相同的键的进行覆盖):

代码演示:

dic = {"name":"胡澳","age":20,"班级":"17级计科六班"}
dic1 = {"name":"赵润全","weight":20}
dic.update(dic1)  
print(dic)

运行结果:

D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py
{'name': '赵润全', 'age': 20, '班级': '17级计科六班', 'weight': 20}

进程已结束,退出代码0

代码分析:dic1中有和dic中一样的键name,所以更新后就会覆盖dic中的值(胡澳)成为(赵润全)。dic中没有的键值对weight就直接添加到dic中。

 

查:

先介绍一下字典的常规查询。

代码演示:

1 dic = {"name":"胡澳","age":20,"班级":"17级计科六班"}
2 print(dic.keys(),type(dic.keys()))
3 print(dic.values(),type(dic.values()))
4 print(dic.items(),type(dic.items()))
5 
6 for i in dic:
7     print(i)

运行结果:

D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py
dict_keys(['name', 'age', '班级']) <class 'dict_keys'>
dict_values(['胡澳', 20, '17级计科六班']) <class 'dict_values'>
dict_items([('name', '胡澳'), ('age', 20), ('班级', '17级计科六班')]) <class 'dict_items'>
name
age
班级

进程已结束,退出代码0

代码分析:可以看出,字典中的键和值都是独立类型的存在。用for去遍历字典的时候,打印的是字典的键。字典的键和值打印出来也是列表,使用方法和列表一样。

交换赋值(a,b = b,a):

代码演示:

a = 10
b = 20
a,b = b,a
print(a,b)

运行结果:

D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py
20 10

进程已结束,退出代码0

代码分析:在别的语言中交换两个变量的值得用三个变量,需要有一个中间变量进行过度。但是在python中直接交换就行。

因为在python中的存储如图:

除了存储了每个变量的内存地址以外。还存储了变量的对应关系。所以在交换的时候,直接将变量的对应关系进行交换,然后在根据名字再去找对应的内存地址,就可以交换。实质上内存地址并没有变化,只是对应关系发生了变化。

而在python中这一交换的特性被放大:

代码演示:

a,b = [1,2,3],[4,5,6]
print(a)
print(b)

a,b = (2,3)
print(a)
print(b)

 

运行结果:

D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py
20 10
[1, 2, 3]
[4, 5, 6]
2
3

进程已结束,退出代码0

代码分析:可以看出,a,b两边都可以进行配对,只要是对应的,左边变量数量和右边的相等就行。

分别打印键和值:

代码演示:

dict = {"name":"胡澳","age":10,"班级":"计算机与技术专业"}
for k,v in dict.items():
    print(k,v)

运行结果:

D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py
name 胡澳
age 10
班级 计算机与技术专业

进程已结束,退出代码0

通过键值直接查询:

代码演示:

dict = {"name":"胡澳","age":10,"班级":"计算机与技术专业"}
a = dict["name"]
print(a)

运行结果:

D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py
胡澳

进程已结束,退出代码0

但是没有找到键值的话就会报错。

dict = {"name":"胡澳","age":10,"班级":"计算机与技术专业"}
a = dict["weight"]
print(a)

运行结果:

D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py
Traceback (most recent call last):
  File "D:/学习资料/项目/练习/lianxi.py", line 2, in <module>
    a = dict["weight"]
KeyError: 'weight'

进程已结束,退出代码1

Get :get的出现缓解了报错的现象

代码演示:

dict = {"name":"胡澳","age":10,"班级":"计算机与技术专业"}
'''
def get(self, *args, **kwargs): # real signature unknown
        """ Return the value for key if key is in the dictionary, else default. """
        pass
如果找到了键就返回值,如果没有就返回默认值
'''
a1 = dict.get("name")
print(a1)

a2 = dict.get("weight")
print(a2)

a3 = dict.get("weight","没有这个键")
print(a3)

运行结果:

D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py
胡澳
None
没有这个键

进程已结束,退出代码0

代码分析:可以看出get的返回值是None,也可以字节在后面设一个返回的默认值。这就比较好的解决了报错的问题。因为你有时也不知道,拿过来的数据有没有这个键。

五、字典的嵌套

字典的嵌套和列表的嵌套一样,找准当前是在哪一个层次上面,出来的是列表还是字典,运用相关的方法进行操作就行。

代码演示:

dict = {
    "name":["胡澳","赵润全","丁瑶","陈毅"],
    "计科六班":{
        "people1":{"name":"胡澳","age":19,"班级":"计算机科学与技术"},
        "people2":{"name":"赵润全","age":19,"班级":"计算机科学与技术"}
    },
    "age":19
}

#将name中的胡澳替换成huao
dict["name"][0] = "huao"
print(dict)

#在people1中加入爱好
dict["计科六班"]["people1"].setdefault("兴趣爱好","打篮球")
print(dict)

运行结果:

D:\常用软件\Python3.7\python文件\python.exe D:/学习资料/项目/练习/lianxi.py
{'name': ['huao', '赵润全', '丁瑶', '陈毅'], '计科六班': {'people1': {'name': '胡澳', 'age': 19, '班级': '计算机科学与技术'}, 'people2': {'name': '赵润全', 'age': 19, '班级': '计算机科学与技术'}}, 'age': 19}
{'name': ['huao', '赵润全', '丁瑶', '陈毅'], '计科六班': {'people1': {'name': '胡澳', 'age': 19, '班级': '计算机科学与技术', '兴趣爱好': '打篮球'}, 'people2': {'name': '赵润全', 'age': 19, '班级': '计算机科学与技术'}}, 'age': 19}

进程已结束,退出代码0

代码分析:字典的嵌套和列表的嵌套其实相差不大,关键值找准在哪一个层次上,当前层次是那个类型,有什么方法。

 

posted @ 2019-10-16 16:42  江湖混子  阅读(158)  评论(0编辑  收藏  举报