python基础二_03_推导式和深浅拷贝
导读:
本文主要记录自己学习python3基础中推导式(列表,字典,集合)和深浅拷贝的要点知识和例子;仅供自己梳理。
一、列表推导式
列表推导能非常简洁的构造一个新列表:只用一条简洁的表达式即可对得到的元素进行转换变形。
语法:[变量 for 变量 in 可迭代对象]
1.为什么要使用推导式?
现在我们要生成一个列表,列表当中的元素为0-10,首先我们不用列表推导式,该如何来实现?
list1 = []
for i in range(10):
list1.append(i)
print(list1)
那如何用列表推导式呢?
# 很明显,使用推导式代码简洁很多
list2 = [i for i in range(10)]
print(list2)
2.在列表推导式中使用流程控制
求出0-20间所有的偶数
list3 = [i for i in range(20) if i %2 == 0]
print(list3)
打印出从(0,0)到(9,9)的所有坐标
list4 = [ (i,j) for i in range(10) for j in range(10)]
print(list4)
# 类似的还有:
# a = [(i,j) for i in range(1,5) for j in range(6,10)]
# print(a)
# 可以看到两层循环的列表推导式可读性就有点差了,所以多次嵌套不建议列表推导式
比如现在有一列表L = [[1,2,3],[4,5,6],[7,8,9]]。要求出1/4/7 和 1/5/9 元素,思考如何取出?
L = [[1,2,3],[4,5,6],[7,8,9]]
# 取到 147
result1 = [i[0] for i in L]
print(result1)
# 取到 159
# len(L)获取长度为3,第一次i = 0,L[i][0]取值下标为0 中的第一个元素
result2 = [L[i][i] for i in range(len(L))]
print(result2)
二、字典推导式
字典和集合推导式是以上思想的延续,语法差不多,只不过产生的是集合和字典而已。
dic1 = {k:v for k,v in [('a',1),('b',2)]}
print(dic1)
三、集合推导式
set1 = {i for i in [1,2,3,4]}
print(set1)
四、元组生成式
元组没有推导式,只有生成式,但是生成的是惰性序列,只有通过list()才能看
tup1 = (i for i in range(5))
print(tup1) # 惰性序列
print(list(tup1))
五、深浅拷贝
1.深拷贝:
拷贝所有对象,包括顶级对象以及嵌套对象,所以原始对象的改变不会造成深拷贝里任何子元素的改变
2.浅拷贝:
只拷贝顶级对象, 没有拷贝嵌套对象,所以原始数据改变,嵌套对象会改变!
3.应用场景
比如在CMDB系统中,我们定义了一个报警模版call给所有的服务器使用,
此时有一批特殊应用的服务器需要不通的报警参数,
我们既不想单独新建模版来一个一个添加报警参数,又不想修改默认模版而影响其他机器的报警阈值。
此时我们就需要用深拷贝来完成。
我们在维护服务器信息的时候,经常会要更新服务器信息,这时我们重新一个一个添加是比较麻烦的,
我们可以把原数据类型拷贝一份,在它的基础上做修改。
4.简单的例子
import copy
a = [1,2,3,4,[5,6,7,9,10]]
b = a
print('a的di:%s,b的id:%s'%(id(a),id(b)))
c = copy.copy(a)
print(id(c))
d = copy.deepcopy(a)
print(id(d))
a.append(8)
a[4].append(9)
print(a)
print(b)
print(c)
print(d)