1. copy 浅复制
1.1 用copy()对字典进行浅复制
我们先看看两个字典指向同一个对象的情况,就不是复制的情况。
d={'a':1,'b':2,'c':3}
d2=d
d2['a']=10
print('d=',d)
print('d2=',d2)
结果
我们发现,d2的值改变了,d的值也改变了。如果用copy()
对d进行浅复制就不会这样。一个值改变不会影响另一个。
d={'a':1,'b':2,'c':3}
d2=d.copy()
print('d2=',d2)
d2['a']=10
print('d=',d)
print('d2=',d2)
可以看到d2的值改变了,D的值并没有受到影响。其实复制后,产生了另一个对象。
d={'a':1,'b':2,'c':3}
d2=d.copy()
print('d id=',id(d))
print('d2 id=',id(d2))
1.2 浅复制是复制序列本身
浅复制是复制序列本身,如果序列内还有序列是不会复制的,例如
d={'a':{'name':'葫芦娃','age':10,'sex':'男'},'b':2,'c':3}
d2=d.copy()
print('d=',d)
print('d2=',d2)
print('d id=',id(d))
print('d2 id=',id(d2))
d2['a']['name']='猪八戒'
print('d=',d)
print('d2=',d2)
print('d id=',id(d))
print('d2 id=',id(d2))
结果
D:\Python38\python.exe D:/work/基础/Day09/课堂代码.py
d= {'a': {'name': '葫芦娃', 'age': 10, 'sex': '男'}, 'b': 2, 'c': 3}
d2= {'a': {'name': '葫芦娃', 'age': 10, 'sex': '男'}, 'b': 2, 'c': 3}
d id= 1838723700928
d2 id= 1838723701184
d= {'a': {'name': '猪八戒', 'age': 10, 'sex': '男'}, 'b': 2, 'c': 3}
d2= {'a': {'name': '猪八戒', 'age': 10, 'sex': '男'}, 'b': 2, 'c': 3}
d id= 1838723700928
d2 id= 1838723701184
Process finished with exit code 0
可以看到,虽然字典d2对字典d成功完成了复制,当我修改了字典d2中的’name’:'葫芦娃’时,字典d也跟着改变了。这就是浅复制是复制序列本身,如果序列内还有子序列是不会被复制的。字典d中因为有子序列{‘name’: ‘葫芦娃’, ‘age’: 10, ‘sex’: ‘男’},所以该子序列没有复制。这时浅复制的一个特点。
再举例
lst=[1,2,3,[4,5,6]]
lst2=lst.copy()
print('lst=',lst)
print('lst2=',lst2)
print('lst id=',id(lst))
print('lst2 id=',id(lst2))
lst2[0]=10
lst2[3][0]=100
print('lst=',lst)
print('lst2=',lst2)
print('lst id=',id(lst))
print('lst2 id=',id(lst2))
结果
1.3 遍历字典
三种方式遍历字典
1.3.1 keys() 该方法返回字典所有的key
受先我们用该方法打印一下字典的所有键
d={'name':'葫芦娃','age':10,'sex':'男'}
print(d.keys())
结果返回的是:
dict_keys(['name', 'age', 'sex'])
这是一个类型
d={'name':'葫芦娃','age':10,'sex':'男'}
print(type(d.keys()))
返回的是
<class 'dict_keys'>
这就是一个字典所有的键的类型
下面我们通过遍历指点来获取键
d={'name':'葫芦娃','age':10,'sex':'男'}
for k in d:
print(k)
返回值是
name
age
sex
这是所有的键
那么利用这个特性我们可以得到所有的键值对
d={'name':'葫芦娃','age':10,'sex':'男'}
for k in d:
print(k,d[k])
返回的是
name 葫芦娃
age 10
sex 男
1.3.1 values() 该方法返回一个序列
values() 该方法返回一个序列,序列的元素是字典所有值
d={'name':'葫芦娃','age':10,'sex':'男'}
for v in d.values():
print(v)
返回的是
葫芦娃
10
男
再看类型
d={'name':'葫芦娃','age':10,'sex':'男'}
print(type(d.values()))
print(d.values())
返回的是
<class 'dict_values'>
dict_values(['葫芦娃', 10, '男'])
它是字典值得一个类型,里面保存的是字典的所有值
1.3.1 items() 返回的是字典的键和值
d={'name':'葫芦娃','age':10,'sex':'男'}
print(type(d.items()))
print(d.items())
返回值
<class 'dict_items'>
dict_items([('name', '葫芦娃'), ('age', 10), ('sex', '男')])
dict_items是字典所有的项的类型
其中返回的是双值子序列,双值,一个是键,一个是值。 也可以遍历这个对象
d={'name':'葫芦娃','age':10,'sex':'男'}
for k,v in d.items():
print(k,v)
返回
name 葫芦娃
age 10
sex 男
如果只有一个变量来接收会怎么样呢?试一下:
d={'name':'葫芦娃','age':10,'sex':'男'}
for k in d.items():
print(k)
返回的是双值的元组
('name', '葫芦娃')
('age', 10)
('sex', '男')
看类型
d={'name':'葫芦娃','age':10,'sex':'男'}
for k in d.items():
#print(k)
print(type(k))
返回
<class 'tuple'>
<class 'tuple'>
<class 'tuple'>
2. 集合
2.1 集合特点
- 集合中只能存储不可变对象
- 集合中的存储对象是无序的,即不是按照元素的插入顺序保存的
- 集合中不能出现重复元素
2.2 可以在python文档中查看集合的用法
2.3 创建集合
用大括号来创建
s={1,2,3,4,5}
print(s,type(s))
返回值
{1, 2, 3, 4, 5} <class 'set'>
不能有重复的元素
s={1,1,1,2,2,2,3,3,3,4,4,4,5,5,5}
print(s,type(s))
结果是
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201112134258154.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzQ2NzM4NDY3,size_16,color_FFFFFF,t_70#pic_center)
只能存储不可变对象,如果存储了可变对象,如列表,就会报错
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201112134455683.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzQ2NzM4NDY3,size_16,color_FFFFFF,t_70#pic_center)
#### 2.4 创建空集合要用set()函数
如果有这样一个东西
s={}
它是个字典呢还是集合呢?
结果显示是字典类型
如果要创建一个空的集合则要用set()函数
s=set()
print(type(s))
可以看到,结果是集合类型了。
set()函数可以将序列和字典转换成集合
s=set([1,1,1,2,2,2,3,3,3,34,4,45,5,5,5])
print(s,type(s))
可以看到把列表转换成了集合,其中重复的元素也没有了。
如果将字典转换成集合,只会包含字典中的键
# print(s,type(s))
d={'name':'葫芦娃','age':10,'sex':'男'}
s=set(d)
print(s)
返回结果是由所有键组成的集合
不能够通过索引值查找集合中的元素,因为集合里的元素是无序的。
2.4 集合的使用
集合的使用和列表字典类似
2.4.1 in与not in
s={1,2,3,'a','b','c'}
print('a' in s)
print(3 not in s)
结果
2.4.2 add()向集合中添加元素
s={1,2,3,'a','b','c'}
s.add(10)
s.add(30)
print(s)
结果
2.4.3 update() 将一个集合中的元素添加到另一个集合中
将集合s2添加到集合s中去
s={1,2,3,'a','b','c'}
s2={'王朝','马汉','张龙','赵虎'}
s.update(s2)
print(s)
结果
2.4.3 pop() 随机删除集合中的一个元素
pop()删除一个元素后,会将该元素作为返回值
s={1, 2, 'a', 3, '王朝', 'b', '赵虎', 'c', '马汉', '张龙'}
r=s.pop()
print(s)
print(r)
结果
随机删除的,删除了1 。
2.4.4 remove() 删除集合中指定的元素
语法s.remove(要删除的元素)
s={1, 2, 'a', 3, '王朝', 'b', '赵虎', 'c', '马汉', '张龙'}
s.remove('王朝')
print(s)
结果
2.4.5 clear() 清空集合
语法s.clear()
s={1, 2, 'a', 3, '王朝', 'b', '赵虎', 'c', '马汉', '张龙'}
s.clear()
print(s)
返回值
set()
空集合
2.5 集合的运算
2.5.1 交集运算
符号:&
s1={1,2,3,4,5,6,7}
s2={4,5,6,7,8,9,10}
print(s1&s2)
结果
2.5.1 并集运算
符号:|
s1={1,2,3,4,5,6,7}
s2={4,5,6,7,8,9,10}
print(s1|s2)
结果
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
2.5.1 差集运算
符号:-
s1={1,2,3,4,5,6,7}
s2={4,5,6,7,8,9,10}
print(s1-s2)
2.5.1 异或集运算
符号:^
异或运算是指,把双方互相都不拥有的元素取出来,组成一个集合,即两个集合不相交的部分。
s1={1,2,3,4,5,6,7}
s2={4,5,6,7,8,9,10}
print(s1^s2)
结果
2.5.1 检查一个集合是否是另一个集合的子集、真子集
运算符:<=,<
s1={1,2,3,4,5,6,7}
s2={4,5,6,7,}
s3={1,2,3,4,5,6,7}
r1= s2<=s1 # 检验s2是不是s1的子集
r2= s2<s1 # 检验s2是不是s1的真子集
r3= s3<=s1 # 检验s3是不是s1的子集
r4= s3<s1 # 检验s3是不是s1的真子集
print(r1)
print(r2)
print(r3)
print(r4)
返回结果
True
True
True
False
2.5.1 检查一个集合是否是另一个集合的超集、真超集
运算符:>=,>
s1={1,2,3,4,5,6,7}
s2={4,5,6,7,}
s3={1,2,3,4,5,6,7}
r1= s1>=s2 # 检验s1是不是s2的超集
r2= s1>s2 # 检验s1是不是s2的真超集
r3= s1>=s3 # 检验s1是不是s3的超集
r4= s1>s3 # 检验s1是不是s3的真超集
print(r1)
print(r2)
print(r3)
print(r4)
返回结果
True
True
True
False
3. 函数
函数也是一个对象,是面向对象编程的产物。避免重复造轮子,一个轮子造好了,随处需要随处用。而且修改程序方便(或叫维护),直接面向我们的函数修改,所有用到这个函数的地方就都修改了。
语法格式
def 函数名(形参1,形参2,......)
代码块
def fn():
print('这是我创建的第一个函数!')
print(fn)
这个函数整体作为一个对象被保存。
如果要执行函数,调用就行了,调用的方法就是
函数名()
在这个例子里是
fn()
结果返回
这是我创建的第一个函数!
大家记住,fn就是一个函数对象,fn()是调用这个函数。
3.1 定义函数
在定义函数的时候,可以在函数名后面定义数量不等的形参。就相当于子啊函数内部声明了变量。
如果函数在定义的时候,定义了形参,那么函数在调用的时候,就要传入实参,有几个形参,就要传递几个形参。
def twosum(a,b):
r=a+b
print(r)
调用几次都可以。调用的时候记得传递相等数量的实参。
3.2 函数的传递方式
在定义形参的时候,可以为形参指定默认值。指定了默认值以后,如果用户传递了参数,则默认值不起作用,如果用户没有传递参数,则默认值生效。
例题:
def fn2(a,b,c=20):
print('a=',a)
print('b=',b)
print('c=',c)
fn2(1,2,3)
fn2(1,2)
3.2.1 位置参数传递
按照形参的位置顺序传递实参
例题:
def fn2(a,b,c):
print('a=',a)
print('b=',b)
print('c=',c)
fn2(1,2,3)
fn2(3,2,1)
结果
3.2.2 关键字传参
在实际传参的时候,也可以按照关键字传参,不必考虑顺序。
例题:
def fn2(a,b,c):
print('a=',a)
print('b=',b)
print('c=',c)
fn2(1,2,3)
fn2(c=3,b=2,a=1)
结果
3.2.3 混合传参
关键字传参和位置传参可以混合使用,但是记住,关键字参数不能再位置参数的前面。否则会报错。
例题:
def fn2(a,b,c):
print('a=',a)
print('b=',b)
print('c=',c)
fn2(1,2,a=3)
#fn2(c=3,b=2,a=1)
结果