浅复制+集合+函数上(函数定义+函数的传参方式)2020-11-12

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)

结果
在这里插入图片描述

4. 作业

4.1 写博客梳理知识

4.2 课堂代码敲三遍

猜你喜欢

转载自blog.csdn.net/m0_46738467/article/details/109639182
今日推荐