本文始發於我的公衆號:TechFlow,原創不易,求個關注python
咱們都知道Python是一個很是靈活的語言,以致於若是它不是你的第一門語言,你會發現它總能給你各類各樣的驚喜,讓你忍不住驚歎:woc,還有這種操做。尤爲我在系統地學習Python以前是Java後端出身,因此每一階段幾乎都會讓我以爲打開了新世界的大門。今天就和你們介紹一個最基礎,很是好用,可是不少人不知道的操做。編程
咱們都知道,Python容許進行多個變量的賦值操做,好比著名的交換兩個元素,若是是在C++或者Java語言當中,若是不經過函數實現,必需要引入第三個變量,好比:後端
# swap a, b
c = a
a = b
b = c
複製代碼
a, b = b, a
複製代碼
除此以外,Python還支持tuple和list的解壓。數組
舉個例子,假設咱們有一個二元數組:[1, 2],咱們但願用兩個變量分別獲取它的第0位和第一位,咱們固然能夠寫成這樣:緩存
l = [1, 2]
a, b = l[0], l[1]
複製代碼
l = [1, 2]
a, b = l
複製代碼
l = [[1, 2], [3, 4], [5, 6]]
for i, j in l:
print(i, j)
複製代碼
a, b, c = 1, 3, (4, 5)
print(c)
複製代碼
都不對,輸出的結果是(4, 5),也就是說Python發現變量數量對不上以後,會自動將tuple當作一個總體進行賦值。不但如此,即便是下面這種狀況,Python也能自動識別:函數
a, b, (c, d), e = 1, 3, (4, 5), 7
print(c, d)
複製代碼
在有的時候,咱們在獲取元素的時候,源數據當中有咱們不須要的字段。雖然Python自動解壓很是方便,可是咱們仍是要爲咱們不須要的數據設置變量。在一些狀況下這會致使內存的浪費,而且這也不符合咱們編程的規範,即全部變量都應該派上用場。爲了解決這個問題,Python提供缺省元素的方法。咱們可使用_來表明一個缺省值,_對應的數據不會被存儲下來,只是爲了方便咱們」湊齊「元素。學習
舉個例子,還用上面的例子舉例,假設源數據的格式是這樣:1, 3, (4, 5), 7,可是咱們只須要中間的元組,咱們就能夠這樣去接收:spa
_, _, (c, d), _ = 1, 3, (4, 5), 7
複製代碼
a = {}
for _, v in a.items():
print(v)
複製代碼
既然變量能夠解壓,那麼天然也能夠壓縮。想象一個場景,好比有一批衡量工廠零件的數據,這個數據當中除了零件的尺寸以外還包含了零件的名稱,生產日期和工廠名稱等等其餘的屬性。假設咱們當下但願解析這份數據,而且將零件的尺寸用數組存儲,這個時候應該怎麼辦呢?code
好比,零件的數據的規格長這樣:wheel, factory1, 3, 4, 5, 6, 2020-02-02cdn
Python一樣針對這個問題提供瞭解決方法,就是變量壓縮符*,針對上面那個問題,咱們能夠寫成:
data = ['wheel', 'factory1', 3, 4, 5, 6, '2020-02-02']
name, factory, *inch, date = data
print(inch)
複製代碼
到這裏,咱們介紹了缺省符號的用法,介紹了壓縮符號的用法,問題來了,咱們能不能將這兩個符號組合使用,獲取數據當中任意個缺省值呢?
固然是能夠的,仍是剛纔的問題,假設咱們如今不關心零件的尺寸,想要過濾掉它們,咱們只要對上面的代碼稍做改動便可:
data = ['wheel', 'factory1', 3, 4, 5, 6, '2020-02-02']
name, factory, *_, date = data
複製代碼
到這裏還沒結束,不知道你們在看到 * 這個操做符號的時候有沒有什麼聯想,若是稍稍瞭解過Python的話,應該會想起Python當中,若是咱們想讓一個函數接收任何參數的話,咱們能夠寫成:
def func(*args, **kw):
pass
複製代碼
其中args其實表明一個數組,kw表明一個dict,這些咱們都是知道的。可是前面的 * 和 ** 呢,又表明什麼呢?
*表明解壓數組,**天然就表明解壓dict。咱們來看個例子:
a = [1, 3, 5]
print(a)
print(*a)
複製代碼
請問print(a)和print(*a)有什麼區別?若是你試一下就會發現,直接打印a,出來的結果是[1, 3, 5],若是你打印 *a,獲得的結果是1, 3, 5。也就是說前者是將a當成一個數組輸出,是一個變量,後者則是將a解壓了,當成了3個變量輸出。那麼一樣的道理,**kw,也是將做爲dict的kw解壓,以key: value的形式展開。不過若是你直接調用 **kw會獲得一個報錯,這個操做只能在函數傳遞參數的時候使用。
因此到這裏,咱們就明白了,*args和**kw爲何可以表明全部參數了。由於前者表明了直接傳遞的必選參數,後者呢,表明提供了默認值的默認參數。這也是爲何Python限定了默認參數必須放在必選參數後面的緣由,一方面是爲了消除歧義,另外一方面也是爲了可以用*args, **kw來統一表示。
今天的內容雖然簡單,可是在實際代碼當中常常用到,用得好的話能夠大大簡化咱們coding的難度以及代碼的美觀程度,所以若是對Python感興趣的同窗,很是推薦一學。
今天的文章就是這些,若是以爲有所收穫,請順手掃碼點個關注吧,大家的舉手之勞對我來講很重要。
參考資料 Python cookbook 第三版
維基百科