最近學習python,看《Python基礎教程》(第2版),發現函數定義裏面有一個「收集參數」頗有趣。java
用戶定義函數時,能夠定義一個肯定參數數量的函數,如:python
>>> store(data, name1, name2, name3)
可是假如定義前不知道有多少個參數,該如何定義呢,C++和java中都有相應的解決方法,python中天然也有函數
def print_params(*params): print(params)
這裏參數前面加上了星號*,便是不肯定數量的參數,調用方式以下:學習
>>> print_params('Testing') ('Testing',) >>> print_params(1, 2, 3) (1, 2, 3) >>> print_params() ()
從上面的三個例子能夠看出,使用*做爲不肯定數量參數,輸入參數爲元組類型spa
這種方法爲啥叫收集參數呢?由於它收集全部其他位置參數,這樣其實說明,它只能在參數末尾進行收集,而不能在開頭或者中間收集code
除了收集散列的參數,還能夠收集key-value字典類型的參數,例如:blog
def print_params_3(**params): print(params)
調用方式:教程
>>> print_params_3(x=1, y=2, z=3) {'z': 3, 'x': 1, 'y': 2}
兩者一塊兒用:class
print_params_4(x, y, z=3, *pospar, **keypar): print(x, y, z) print(pospar) print(keypar)
調用方式;基礎
>>> print_params_4(1, 2, 3, 4, 5, 6, 7, foo=1, bar=2) 1 2 3 (5, 6, 7) {'foo' : 1, 'bar' : 2} >>> print_params_4(1,2) 1 2 3 () {}
參數收集的逆過程:
函數參數使用*號收集獲得元組,使用**收集獲得字典,那麼反過來使用元組和字典能夠做爲函數參數
def add(x,y): return x+y>>> params = (1, 2)>>> add(*params)3