先看如下代碼python
x = 1 y = 2 tmp = x x = y y = tmp print(x, y)
代碼的輸出結果是:2 1程序員
再看如下代碼:express
x = 1 y = 2 x, y = y, x print(x, y)
代碼的輸出結果是:2 1segmentfault
x, y = y, x
這段代碼背後的含義就是解構和封裝數據結構
<!--more-->ide
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)ui
In [8]: lst = [1, 2] In [9]: first, second = lst In [10]: print(first, second) 1 2
按照元素順序,把線性結構lst的元素賦給變量first,secondspa
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)
總結爲如下規律:code
解構是支持多層次的
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合法的標識符, 可是若是不是要丟棄一個變量,一般不要用單個下劃線表示一個有意義的變量。能夠理解爲約定俗成。
很是複雜的數據結構,多層嵌套的線性結構的時候,能夠用解構快速提取其中的值,很是的便利
好比如下的使用方法
In [1]: key, _, value = 'I love Python'.partition(' love ') In [2]: key Out[2]: 'I' In [3]: value Out[3]: 'Python'
記得幫我點贊哦!
精心整理了計算機各個方向的從入門、進階、實戰的視頻課程和電子書,按照目錄合理分類,總能找到你須要的學習資料,還在等什麼?快去關注下載吧!!!
念念不忘,必有迴響,小夥伴們幫我點個贊吧,很是感謝。
我是職場亮哥,YY高級軟件工程師、四年工做經驗,拒絕鹹魚爭當龍頭的斜槓程序員。聽我說,進步多,程序人生一把梭
若是有幸能幫到你,請幫我點個【贊】,給個關注,若是能順帶評論給個鼓勵,將不勝感激。
職場亮哥文章列表:更多文章
本人全部文章、回答都與版權保護平臺有合做,著做權歸職場亮哥全部,未經受權,轉載必究!