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']

 





 



 


 

posted on 2019-10-11 17:36  xpc199151  阅读(261)  评论(0编辑  收藏  举报

导航