python常用小技巧&深拷贝浅拷贝&集合
1 交换变量
通过不引用第三方变量
a = 1 b = 2 a = a+b #3 b = a-b #1 a = a-b #2
python 中如何交换
a = 1 b = 2 b,a = a,b #交换2个变量的值,python底层帮你引入一个第三方变量在交换 print(a,b) #2 1
2 同时定义多个变量
a=b=c=0 ##同时定义多个变量,定义了3个变量,值都是0
3 深拷贝浅拷贝
#循环删list里面数据的时候,结果会不正确 s = [1,1,2,3,4,5,6,8] # 0 1 2 3 4 5 6 7 下标 第一次循环 # [1,2,3,4,5,6,8] # 0 1 2 3 4 5 6 下标 第二次循环,第一次循环取过下标位0的值,第二次跨过下标为0的值 for i in s: if i%2!=0: s.remove(i) #remove删除 print(s) # [1,2,4,6,8]
用循环删除的话,可以定义2个相同的list 一个用来循环,一个用来删除
s = [1,1,2,3,4,5,6,8] s1 =[1,1,2,3,4,5,6,8] s3 = s # 浅拷贝 不能写成 s3=s,因为变量存的是内存地址,s3与s指向同一个内存地址,当s的值发生变化,s3的值同样会发生变化 print(id(s)) #查看内存id print(id(s3)) #s3的内存地址和s的内存地址一样的 print(id(s1)) #s1和s的内存地址不一样 深拷贝 #浅拷贝和深拷贝的区别,就是深拷贝会开辟一块新的内存空间 for i in s1: if i%2!=0: s.remove(i) #remove删除 print(s) # [2,4,6,8]
集合
集合天生就能去重 ,集合也是无序的
定义一个集合
s = set() s2 = set('123445533457') s3 = {1,2,3,4,5,6,5,4,4,7} print(s2) #{'7', '2', '4', '1', '3', '5'} print(s3) # {1, 2, 3, 4, 5, 6, 7}
集合操作
s = set() s2 = set('123445533457') s3 = {'1','2','3','4','5','6','5','8','4','7'} # print(s2) # print(s3) # #交集 两个集合相同的地方 # print(s2 & s3) #{'3', '4', '2', '5', '1', '7'} # print(s3.intersection(s2)) #并集 就是把两个集合合并在一起,然后去重 # print(s2 | s3) #{'6', '5', '3', '7', '1', '8', '4', '2'} # print(s2.union(s3)) #差集 取一个集合里面存在的另一个集合不存在的 # print(s3-s2) #{'8', '6'} # print(s3.difference(s2)) #对称差集 去掉两集合里面都有的 # print(s2 ^ s3) # print(s2.symmetric_difference(s3))
集合的增删改查
s3.add('23') #加元素 s3.pop() #随机删除一个 s3.remove('5') #指定删除一个元素 s3.update({1,2,3}) #把另一个集合加进去
集合小练习,校验密码复杂程度
#校验密码复杂程度 校验密码是否包含数字 大写字母 小写字母 特殊字符 import string nums_set= set(string.digits) upper_set = set(string.ascii_uppercase) lower_set = set(string.ascii_lowercase) pun_set = set(string.punctuation) for i in range(5): pwd = input('请输入密码:').strip() pwd_set = set(pwd) if pwd_set &nums_set and pwd_set & upper_set and pwd_set & lower_set and pwd_set & pun_set: print('密码合法',pwd) else: print('密码必须包含大写字母,小写字母,数字,特殊字符')