Python封装和结构
在Python中有封装和解构的概念。封装 ——是将将多个值使用逗号分割,组合在一起 。本质上,返回一个元组,只是省掉了小括号。这是Python特有的概念,现在被很多语言借鉴。
a = (1,2)#元组 b = 1,2#元组 print(type(a)) print(type(b)) 结果为: <class 'tuple'> <class 'tuple'>
解构是把线性结构(也可以是非线性结构)的元素解开,并顺序的赋给其它变量,应该注意的是左边接纳的变量数要和右边解开的元素个数一致。
lst = [3, 5] first, second = lst print(first, second) 结果为: 3 5 a = 4 b = 5 temp = a a = b b = temp print(a,b) a = 4 b = 5 a,b = b,a print(a,b) 上面两个例子的结果都为: 5 4
a,b =1,2,3
结果为
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-13-1f237ab311da> in <module>
----> 1 a,b =1,2,3
ValueError: too many values to unpack (expected 2)
a,b,c=1,2
结果为:
ValueError Traceback (most recent call last)
<ipython-input-14-dfc132c7dc8e> in <module>
----> 1 a,b,c=1,2
ValueError: not enough values to unpack (expected 3, got 2)
上面的例子中,a, b = b, a,等号右边使用了封装,而左边就使用了解构。
a,b = {10,20} print(a,b) 结果为: 10 20 a,b = {'a':10,'b':20} # 非线性结构也可以解构 print(a,b) 结果为: a b a,b = {10,20,30} print(a,b) 结果为: --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-29-f1e9d0f368d9> in <module> ----> 1 a,b = {10,20,30} 2 print(a,b) ValueError: too many values to unpack (expected 2) a,*b = {10,20,30} print(a,b) 结果为: 10 [20, 30] [a,b] = (1,2) print(a,b) 结果为: 1 2 [a,b] = 10,20 print(a,b) 结果为: 10 20 (a,b) = {30,40} print(a,b) 结果为: 40 30
Python3中的多变量解构
使用 *变量名 接收多个值,但不能单独使用,被 *变量名收集后组成一个列表 。
lst = list(range(10)) head, *mid, tail = lst print(head,mid,tail) 结果为: 0 [1, 2, 3, 4, 5, 6, 7, 8] 9 *lst2 = lst 结果为: File "<ipython-input-42-419bc512b767>", line 4 SyntaxError: starred assignment target must be in a list or tuple *body, tail = lst print(body,tail) 结果为: [0, 1, 2, 3, 4, 5, 6, 7, 8] 9 head, *tail = lst print(head,tail) 结果为: 0 [1, 2, 3, 4, 5, 6, 7, 8, 9] head, *m1, *m2, tail = lst print(head,m1,m2,tail) 结果为: File "<ipython-input-49-c1bd0409aec6>", line 4 SyntaxError: two starred expressions in assignment head, *mid, tail = "abcdefghijklmn" print(type(mid)) print(head,mid,tail) 结果为: <class 'list'> a ['b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'] n
丢弃变量
丢弃变量是一个惯例,是一个不成文的约定,不是标准。它指的是如果不关心一个变量,就可以定义改变量的名字为_,_是一个合法的标识符,也可以作为一个有效的变量使用,但是定义成下划线就是希望不要被使用,除非你明确的知道这个数据需要使用。所以一般情况,看到下划线就知道这个变量就是不想被使用。
lst = [9,8,7,20] first, *second = lst head, *_, tail = lst print(head) print(tail) print(_) 结果为: 9 20 [8, 7]
lst = [9,8,7,20]
first, *second = lst
_, *_, tail = lst
print(_)
print(tail)
print(_)
结果为:
[8, 7] 20 [8, 7]
所以,_ 这个变量本身无任何语义,没有任何可读性,所以不是用来给人使用的,Python中很多库,都使用这个变量,使用十分广泛。请不要在不明确变量作用域的情况下,使用 _ 导致和库中_ 冲突。
# lst = list(range(10)) 取出第二个、第四个、倒数第二个 _,second,_,four,*_,sa,_ = list(range(10)) print(second,four,sa) 结果为: 1 3 8
从lst = [1,(2,3,4),5]中,提取4出来
lst = [1,(2,3,4),5] a,(b,c,d),e = lst print(d) 结果为: 4 lst = [1,(2,3,4),5] _,(*_,val),*_ = lst print(val) 结果为: 4 _,[*_,val],*_ = lst print(val) 结果为: 4
环境变量JAVA_HOME=/usr/bin,返回环境变量名和路径
key, _ , val = "JAVA_HOME=/usr/bin".partition('=') print(key) print(val) 结果为: JAVA_HOME /usr/bin s = "JAVA_HOME=/usr/bin" s.split("=") 结果为: ['JAVA_HOME', '/usr/bin']