包裹參數的傳遞

定義函數時,咱們有時候並不知道調用的時候會傳遞多少個參數。這時候,包裹(packing)位置參數,或者包裹關鍵字參數,來進行參數傳遞,會很是有用。函數

包裹 

下面是包裹位置傳遞的例子:spa

def func(*name):    print type(name)    print name func(1,4,6)
func(5,6,7,1,2,3)

兩次調用,儘管參數個數不一樣,都基於同一個func定義。在func的參數表中,全部的參數被name收集,根據位置合併成一個元組(tuple),這就是包裹位置傳遞。code

爲了提醒Python參數,name是包裹位置傳遞所用的元組名,在定義func時,在name前加*號。orm

 

下面是包裹關鍵字傳遞的例子:it

def func(**dict):    print type(dict)    print dict

func(a=1,b=9)
func(m=2,n=1,c=11)

與上面一個例子相似,dict是一個字典,收集全部的關鍵字,傳遞給函數func。爲了提醒Python,參數dict是包裹關鍵字傳遞所用的字典,在dict前加**import

包裹傳遞的關鍵在於定義函數時,在相應元組或字典前加*或**。原理

 

解包裹

*和**,也能夠在調用的時候使用,即解包裹(unpacking), 下面爲例:im

def func(a,b,c):    print a,b,c

args = (1,3,4)
func(*args)

在這個例子中,所謂的解包裹,就是在傳遞tuple時,讓tuple的每個元素對應一個位置參數。在調用func時使用*,是爲了提醒Python:我想要把args拆成分散的三個元素,分別傳遞給a,b,c。(設想一下在調用func時,args前面沒有*會是什麼後果?)margin

 

相應的,也存在對詞典的解包裹,使用相同的func定義,而後:top

dict = {'a':1,'b':2,'c':3}
func(**dict)

在傳遞詞典dict時,讓詞典的每一個鍵值對做爲一個關鍵字傳遞給func

 

混合

在定義或者調用參數時,參數的幾種傳遞方式能夠混合。但在過程當中要當心先後順序。基本原則是,先位置,再關鍵字,再包裹位置,再包裹關鍵字,而且根據上面所說的原理細細分辨。

相關文章
相關標籤/搜索