2018.6.8 Python第五课

今天主要讲了元组,字典和集合


1.元组

1.1 元组比较简单,它和列表基本相同,不同的是元组使用()来定义,而且元组的元素不能修改,增删改都不可以。
但是可以查,也是通过下标(索引)查询。

#定义一个元组
a=('a','b',1,2)
#从元组中取值可以直接使用索引
print(a[2])

以上输出结果为:1

1.2元组还可以拆包:

a=('a','b',1,2)
#拆包可以直接对元组的元素进行赋值操作
a1,a2,a3,a4=a
print(a1,a2,a3,a4)

以上输出结果为:a b 1 2
需要注意的是,进行拆包操作时,赋值的变量名称个数必须与元组中的元素个数相同,否则程序会报错


2.字典

2.1字典定义
字典是另一种可变容器模型,且可存储任意类型对象。
字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示:
d = {key1 : value1, key2 : value2 }
键必须是唯一的,但值则不必。
值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组
2.2访问字典中的值
字典中的键类似于列表中的索引,所以访问字典的值和访问列表的相似,只不过把索引换成键就可以了

dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
print ("dict['Name']: ", dict['Name'])
print ("dict['Age']: ", dict['Age'])

以上实例输出结果:
dict['Name']: Runoob
dict['Age']: 7

2.3修改字典中的键值对
删除:del 字典名称[键] 或者删除整个字典就是del 字典名称
修改: 字典名称[要修改的值的键]=要改成的值
增加: 字典名称[要增加的键]=要增加的值
清空字典:字典名称.clear()
2.4字典的特性
不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住,如下实例:

dict = {'Name': 'Runoob', 'Age': 7, 'Name': '小菜鸟'}
print ("dict['Name']: ", dict['Name'])

以上实例输出结果:
dict['Name']: 小菜鸟
键必须不可变,所以可以用数字,字符串或元组充当,而用列表就不行
2.5字典的一些方法
keys():所有键组成的列表
values():所有值组成的列表
items():是键和值组成的元组再组成的列表
2.6字典是支持无限嵌套的

cities={
    '北京':{
        '朝阳':['国贸','CBD','天阶','我爱我家','链接地产'],
        '海淀':['圆明园','苏州街','中关村','北京大学'],
        '昌平':['沙河','南口','小汤山',],
        '怀柔':['桃花','梅花','大山'],
        '密云':['密云A','密云B','密云C']
    },
    '河北':{
        '石家庄':['石家庄A','石家庄B','石家庄C','石家庄D','石家庄E'],
        '张家口':['张家口A','张家口B','张家口C'],
        '承德':['承德A','承德B','承德C','承德D']
    }
}

可以使用如下方法进行列出:

for i in cities['北京']:
 print(i)

结果为:
朝阳
海淀
昌平
怀柔
密云

扫描二维码关注公众号,回复: 1891330 查看本文章
for i in cities['北京']['海淀']:
    print(i)

结果为:
圆明园
苏州街
中关村
北京大学


3.set集合
集合是一个无序不重复元素的集,基本功能包括关系测试和消除重复元素。

3.1定义一个集合
定义一个集合可以用{}
myset={1,2,3,'a','c'}
但是定义一个空集合必须用set()函数:
myset=set()#这是定义一个空集合
myset={}#这是定义一个空字典
3.2集合的一些方法
union联合:将两个集合合并
intersection交集:两个集合重合的部分
difference差集:两个集合不重合的那部分,只有一部分
sysmmetric_difference对称差集:两个集合不重复的那部分,是两部分
如下图所示:
python集合
3.3集合的添加和删除
python 集合的添加有两种常用方法,分别是add和update。
集合add方法:是把要传入的元素做为一个整个添加到集合中,例如:

a = {'boy'}
a.add('python')
print(a)

以上代码运行结果为:
{'python','boy'}
集合update方法:是把要传入的元素拆分,做为个体传入到集合中,例如:

a={'boy'}
a.update('abc')
print(a)

以上代码运行结果为:
{'c','a','boy','b'}
集合中的元素删除操作方法:remove,例如:

a={'boy','python'}
a.remove('python')
print(a)

以上代码执行结果为:
{'boy'}
3.4python set() 集合操作符号、数学符号
集合的交集、合集(并集)、差集,了解python集合set与列表list的这些非常好用的功能前,要先了解一些集合操作符号
python集合操作符号
简单的演示下差集、交集和合集的概念:
python集合演示


4.深复制和浅复制

对于可变对象如:列表、字典,直接赋值时只会将一个对象的引用传递给另一个对象,此时修改其中一个对象就会改变另一个对象,如:

a = [1,2,3]
b = a
a,b

#结果为([1, 2, 3], [1, 2, 3]),当改变其中一个元素的时候,另一个也会随之改变

a[0]=100
a,b

#结果为([100, 2, 3], [100, 2, 3])

大多数情况下,一个可变对象内还可以嵌套其它可变对象,此时浅复制只会复制顶级对象,而对于嵌套的对象,只会复制它的引用,所以修改顶级对象不会影响另一个对象,但是如果修改嵌套的对象就会影响两个对象了:

a = [1,2,3, ["Aaron", "Tom"]]
b = a.copy()
a,b

#结果为([1, 2, 3, ['Aaron', 'Tom']], [1, 2, 3, ['Aaron', 'Tom']]),修改a的父层元素的时候,b不会改变

a[1]=100
a,b

#结果([1, 100, 3, ['Aaron', 'Tom']], [1, 2, 3, ['Aaron', 'Tom']])但修改子层元素的时候,会改变另一个

b[3][1]="Jacky"
a,b

#结果就是([1, 100, 3, ['Aaron', 'Jacky']], [1, 2, 3, ['Aaron', 'Jacky']])

由此可见,在浅复制的情况下修改顶级元素不会影响另一个对象,但是修改内部可变元素时就会同时修改原始对象与新对象了,为了解决这个问题字典提供了一个深复制方法。深复制就是将顶级对象以及子对象的值同时复制给新对象,此时修改任何一个都不会影响另一个。
由于字典也是可变对象,所以copy方法也遵循以上原则。
如果想对字典进行深复制操作,需要引用copy包中的deepcopy方法:

import copy
a = [1,2,3, ["Aaron", "Tom"]]
b=deepcopy(a)
print(a,b)

#此时结果为:[1,2,3, ["Aaron", "Tom"]],[1,2,3, ["Aaron", "Tom"]]

a[3][1]='jack'
print(a,b)

#此时结果为:[1,2,3, ["Aaron", "jack"]],[1,2,3, ["Aaron", "Tom"]]

简单的来说就是,在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误!
如下图所示:
浅拷贝和深拷贝

猜你喜欢

转载自blog.csdn.net/weixin_40313627/article/details/80636756