Python-封装与解构
1、封装:
定义:
将多个值用括号分割,组合在一起
本质上,返回一个元组,只是省掉了小括号
1 In [99]: t = 1,2,3 # 封装成元组! t = (1,2,3) 2 3 In [100]: t 4 Out[100]: (1, 2, 3)
1 a = 4 2 b = 5 3 tmp = a 4 a = b 5 b = tmp 6 等价于 7 a, b = b, a 8 9 注:但并不是真正的等价,这里右侧是一个封装的元组,对左侧使用了解构
2、解构:
把线性结构的元素解开,并顺序的赋值给其他变量(事实上集合对象也可以)非线性解构也能解构:set()
左边接纳的变量数要和 右边解开的元素个数一致
1 In [12]: a,b,c,d = (1,2,3,4) # 解构 2 3 In [13]: a,b,c,d #封装 4 Out[13]: (1, 2, 3, 4) 5 6 7 非线性解构也能解构:set() 8 9 In [22]: a,b,*c,tail,end= set(range(10)) 10 In [28]: a,b,*c= set(range(10)) 11 12 13 In [22]: a,b,*c,tail,end= set(range(10))# 尽量将多的元素赋值给 *c 14 In [23]: c 15 Out[23]: [2, 3, 4, 5, 6, 7] # 列表 16 17 In [24]: a 18 Out[24]: 0 19 20 In [25]: b 21 Out[25]: 1 22 23 In [26]: tail 24 Out[26]: 8 25 26 In [27]: end 27 Out[27]: 9 28 29 30 In [30]: *c,a= set(range(10)) # *c不能单独存在 *c = set(range(10)) 31 32 In [31]: c 33 Out[31]: [0, 1, 2, 3, 4, 5, 6, 7, 8] 34 35 In [32]: 36 37 In [32]: a 38 Out[32]: 9 39 40 In [34]: [a,b] = (2,3) # 最好两侧要一致的数据结构
In [102]: a
Out[102]: 2
In [103]: b
Out[103]: 3
解构字典,只留key
3、丢弃变量:
这是一个管理,是一个不成文的约定,不是标准
如果不关心一个变量,就可以定义改变量的名字为 _ (下划线)
_ 是一个合法的标识符,也可以作为一个有效的变量使用,但是定义成下划线就是希望不要被使用,除非你明确的知道这个数据需要使用
注:但是利用上一次的结果 _ 的下划线,只能在IPython中使用
1 In [105]: ls = [9,8,7,5] 2 3 In [106]: first,*second = ls 4 5 In [107]: head,*_,tail = ls 6 7 In [108]: print(head) 8 9 9 10 In [109]: print(tail) 11 5 12 13 In [110]: print(_) 14 [8, 7]
1 In [111]: ls 2 Out[111]: [9, 8, 7, 5] 3 4 In [112]: _,*_,tail = ls #后面的_ 覆盖了前面的_ 5 6 In [113]: print(_) 7 [8, 7] 8 9 In [114]: print(tail) 10 5 11 12 In [115]: print(_) 13 [8, 7]
总结:
_ 这个变量本身无任何语义。没有任何可读性,所以不是用来给人使用的
Python中很多库,搜使用这个变量,使用广泛。请不要在不明确变量作用域 的情况下,使用_ 导致和库中 _ 冲突。
1 取出[1,(2,3,4),5]的4 2 3 In [117]: _,(_,_,c),_ = [1,(2,3,4),5] 4 5 In [118]: c 6 Out[118]: 4
1 冒泡法中的封装、解构 2 3 l = [1,9,8,7,6,4,3,2] 4 5 for i in range(len(l)): 6 flag = False 7 for j in range(len(l)-i -1): 8 if l[j] > l[j+1]: 9 l[j],l[j+1] = l[j+1],l[j] 10 flag = True 11 if not flag: 12 break 13 print(l)
1 提取'java_home=/usr/bin' 中的环境变量名和路径 2 3 s = 'java_home=/usr/bin=/a/c/v' 4 5 env,_,path=s.partition('=') # 最好使用partition 如果后面还有等号,用split()必须指定次数 6 7 path
为什么要坚持,想一想当初!