### 解構的理解與用法 ###
解構是python很有特色的一個功能,被很多語言借鑑(例如ES6)
# 元素按照順序賦值給變數 In [31]: lst=list(range(5)) In [32]: head,*mid,tail=lst In [33]: print(head,tail) 0 4 In [34]: print(mid) [1, 2, 3] # 變數和元素個數必須匹配 In [36]: v1,v2,v3,v4,v5,v6=lst ValueError: not enough values to unpack (expected 6, got 5) # *表示可以接受任意個數的元素 # 但*變數不能單獨出現 In [35]: *v=lst SyntaxError: starred assignment target must be in a list or tuple # 也不能重複出現 In [40]: head,*m1,*m2,tail=list(range(5)) ^ SyntaxError: two starred expressions in assignment # 帶*的這個變數的輸出是一個列表 In [37]: head,*mid,tail=1,2 In [38]: print(head,tail) 1 2 In [39]: print(mid) [] # 解構是支援多層次的 In [14]: lst=[1,(2,3),5] In [15]: _,(_,val),*_=lst In [16]: print(val) 3 In [17]: _,[*_,val],*_=lst In [18]: print(val) 3
### 一個慣例,下劃線‘_’ ###
# python有一個慣例,是使用單個下劃線“_”來表示丟棄該變數 In [42]: head,*_,tail=lst In [7]: v1,_,v3,*_,vd,_=lst
### 解構的使用場景 ###
1. 解析配置檔案
In [20]: key,_,value='env=PATH=/usr/bin:$PATH'.partition('=') In [21]: print(key);print(value) env PATH=/usr/bin:$PATH
2. 非常複雜的資料結構,多層巢狀的線性結構的時候,可以用解構快速提取其中的值
3. 函式返回值
### 封裝 ###
封裝:相當於定義一個元組時省略小括號
In [18]: t1=1,2;t2=(1,2) In [20]: type(t1) Out[20]: tuple In [21]: type(t2) Out[21]: tuple //t1和t2等效
# 可用於快速交換兩個變數的值 In [1]: x=1;y=2 In [3]: x,y=y,x //左邊解構,右邊封裝 In [4]: print(x,y) 2 1