在定義函數時,咱們有時候並不知道調用的時候會傳遞多少個參數。這時候,包裹(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。
在定義或者調用參數時,參數的幾種傳遞方式能夠混合。但在過程當中要當心先後順序。基本原則是,先位置,再關鍵字,再包裹位置,再包裹關鍵字,而且根據上面所說的原理細細分辨。