Python解構與封裝

提出問題

先看如下代碼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

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)ui

Python解構

基本解構

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的一個慣例。單個下劃線也是Python合法的標識符, 可是若是不是要丟棄一個變量,一般不要用單個下劃線表示一個有意義的變量。能夠理解爲約定俗成。

解構與封裝的使用

很是複雜的數據結構,多層嵌套的線性結構的時候,能夠用解構快速提取其中的值,很是的便利

好比如下的使用方法

In [1]: key, _, value = 'I love Python'.partition(' love ')

In [2]: key
Out[2]: 'I'

In [3]: value
Out[3]: 'Python'

記得幫我點贊哦!

精心整理了計算機各個方向的從入門、進階、實戰的視頻課程和電子書,按照目錄合理分類,總能找到你須要的學習資料,還在等什麼?快去關注下載吧!!!

resource-introduce

念念不忘,必有迴響,小夥伴們幫我點個贊吧,很是感謝。

我是職場亮哥,YY高級軟件工程師、四年工做經驗,拒絕鹹魚爭當龍頭的斜槓程序員。

聽我說,進步多,程序人生一把梭

若是有幸能幫到你,請幫我點個【贊】,給個關注,若是能順帶評論給個鼓勵,將不勝感激。

職場亮哥文章列表:更多文章

wechat-platform-guide-attention

本人全部文章、回答都與版權保護平臺有合做,著做權歸職場亮哥全部,未經受權,轉載必究!

相關文章
相關標籤/搜索