提出問題
先看以下代碼
x = 1
y = 2
tmp = x
x = y
y = tmp
print(x, y)
代碼的輸出結果是:2 1
再看以下代碼:
x = 1
y = 2
x, y = y, x
print(x, y)
代碼的輸出結果是:2 1
x, y = y, x這段代碼背后的含義就是解構和封裝
Python封裝
In [1]: t = 1, 2
In [2]: t
Out[2]: (1, 2)
In [3]: type(t)
Out[3]: tuple # 定義元組是可以省略小括號的
In [4]: t1 = (1, 2)
In [5]: t2 = 1, 2
# t1和t2等效
In [6]: t1
Out[6]: (1, 2)
In [7]: t2
Out[7]: (1, 2)
所以封裝出來的結果一定是元組,
x, y = y, x這段代碼的右側就會封裝成(y, x)
Python解構
基本解構
In [8]: lst = [1, 2]
In [9]: first, second = lst
In [10]: print(first, second)
1 2
按照元素順序,把線性結構lst的元素賦給變數first,second
加星號解構
In [11]: lst = list(range(5))
In [12]: head, *tail = lst
In [13]: head
Out[13]: 0
In [14]: tail
Out[14]: [1, 2, 3, 4]
In [15]: *lst2 = lst # 左邊必須有一個加星號的變數
File "<ipython-input-15-98211a44ccfb>", line 1
*lst2 = lst
^
SyntaxError: starred assignment target must be in a list or tuple
In [16]: *head, tail = lst
In [17]: head
Out[17]: [0, 1, 2, 3]
In [18]: lst
Out[18]: [0, 1, 2, 3, 4]
In [19]: tail
Out[19]: 4
In [20]: head, *m1, *m2, tail = lst # 星號不能有多個只能有一個
File "<ipython-input-20-1fc1a52caa8e>", line 1
head, *m1, *m2, tail = lst
^
SyntaxError: two starred expressions in assignment
In [21]: v1, v2, v3, v4, v5, v6, v7 = lst # 左邊變數數不能超過右邊元素數
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-21-9366cfb498a1> in <module>()
----> 1 v1, v2, v3, v4, v5, v6, v7 = lst
ValueError: not enough values to unpack (expected 7, got 5)
In [22]: v1, v2 = lst #左邊變數數不能少于右邊元素數
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-22-d7b0a4e7871e> in <module>()
----> 1 v1, v2 = lst
ValueError: too many values to unpack (expected 2)
總結為以下規律:
- 元素按照順序賦值給變數
- 變數和元素必須匹配
- 加星號變數,可以接受任意個數的元素
- 加星號的變數不能單獨出現
多層次解構
解構是支持多層次的
In [23]: lst = [1, (2, 3), 5]
In [24]: _, v, *_ = lst # v決議成(2, 3)
In [25]: v
Out[25]: (2, 3)
In [26]: _, val = v # v可以進一步解構
In [27]: val
Out[27]: 3
In [28]: _, (_, val), *_ = lst # 可以一步一次性解構
In [29]: val
Out[29]: 3
In [30]: _, [*_, val], *_ = lst # 中間部分解構成串列
In [31]: val
Out[31]: 3
In [32]: _, _, val, *_ = lst # (2, 3)決議成第二個_
In [33]: val
Out[33]: 5
Python下劃線的使用
使用單個下劃線 _ 表示丟棄該變數,這是Python的一個慣例,單個下劃線也是Python合法的識別符號, 但是如果不是要丟棄一個變數,通常不要用單個下劃線表示一個有意義的變數,可以理解為約定俗成,
解構與封裝的使用
非常復雜的資料結構,多層嵌套的線性結構的時候,可以用解構快速提取其中的值,非常的便利
比如以下的使用方法
In [1]: key, _, value = 'https://www.cnblogs.com/CHLL55/p/I love Python'.partition(' love ')
In [2]: key
Out[2]: 'I'
In [3]: value
Out[3]: 'Python'
記得幫我點贊哦!
精心整理了計算機各個方向的從入門、進階、實戰的視頻課程和電子書,按照目錄合理分類,總能找到你需要的學習資料,還在等什么?快去關注下載吧!!!

念念不忘,必有回響,小伙伴們幫我點個贊吧,非常感謝,
我是職場亮哥,YY高級軟體工程師、四年作業經驗,拒絕咸魚爭當龍頭的斜杠程式員,
聽我說,進步多,程式人生一把梭
如果有幸能幫到你,請幫我點個【贊】,給個關注,如果能順帶評論給個鼓勵,將不勝感激,
職場亮哥文章串列:更多文章

本人所有文章、回答都與著作權保護平臺有合作,著作權歸職場亮哥所有,未經授權,轉載必究!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/135415.html
標籤:Python
