咱們在昨天的文章中(零基礎學習 Python 之函數)所寫的函數,它們的參數的個數都是肯定的,咱們知道世界是不肯定的,那麼函數的參數固然也有不固定的時候,那麼當咱們碰到這個問題的時候,該怎麼解決呢?請看接下來的文章。python
若是你以前學過 C 或者 C++,看到星號的第一反應可能會認爲這個與指針相關,而後就開始方了,其實放寬心,Python 中是沒有指針這個概念的。bash
在 Python 中咱們使用星號收集位置參數,請看下面的例子:函數
>>> def fun(x,*args):
... print(x)
... res = x
... print(args)
... for i in args:
... res += i
... return res
...
>>> print(fun(1,2,3,4,5,6))
複製代碼
上述例子中,函數的參數有兩個,可是咱們在輸出的時候賦給函數的參數個數不單單是兩個,讓咱們來運行這個代碼,獲得以下的結果:post
1
(2, 3, 4, 5, 6)
21
複製代碼
從上面咱們能夠看出,參數 x 獲得的值是 1,參數 args 獲得的是一個元組 (2,3,4,5,6) ,由此咱們能夠得出,若是輸入的參數個數不肯定,其它的參數所有經過 *args 以元組的方式由 arg 收集起來。學習
爲了更能明顯的看出 *args,咱們下面用一個簡單的函數來表示:ui
>>> def print_args(*args):
... print(args)
...
複製代碼
接下來我傳入不一樣的值,經過參數 *args 獲得的結果咱們來看一下:spa
>>> print_args(1,2,3)
(1, 2, 3)
>>> print_args('abc','def','ghi')
('abc', 'def', 'ghi')
>>> print_args('abc',['a','b','c'],1,2,3)
('abc', ['a', 'b', 'c'], 1, 2, 3)
複製代碼
無論是什麼,均可以一股腦的塞進元組裏,即便只有一個值,也是用元組收集,因此還記得在元組裏一個元素的時候的形式嗎?元組中若是隻有一個元素,該元素的後面要有一個逗號。指針
那麼若是不給 *args 傳值呢?code
>>> def print_args(*args):
... print(args)
...
>>> print_args()
()
複製代碼
答案就是這時候 *args 收集到的是一個空的元組。cdn
最後提醒一點的是,當使用星號的時候,不必定要把元組參數命名爲 args,但這個是 Python 中的一個常見作法。
使用兩個星號是收集關鍵字參數,能夠將參數收集到一個字典中,參數的名字是字典的 「鍵」,對應的參數的值是字典的 「值」。請看下面的例子:
>>> def print_kwargs(**kwargs):
... print(kwargs)
...
>>> print_kwargs(a = 'lee',b = 'sir',c = 'man')
{'a': 'lee', 'b': 'sir', 'c': 'man'}
複製代碼
由例子能夠看出,在函數內部,kwargs 是一個字典。
看到這的時候,可能聰明的你會想,參數不是具備不肯定型嗎?如何知道參數到底會用什麼樣的方式傳值?其實這個很好辦,把 *args 和 **kwargs 綜合起來就行了啊,請看下面的操做:
>>> def print_all(x,y,*args,**kwargs):
... print(x)
... print(y)
... print(args)
... print(kwargs)
...
>>> print_all('lee',1234)
lee
1234
()
{}
>>> print_all('lee',1,2,3,4,5)
lee
1
(2, 3, 4, 5)
{}
>>> print_all('lee',1,2,3,4,5,like = 'python')
lee
1
(2, 3, 4, 5)
{'like': 'python'}
複製代碼
如此這般,咱們就能夠應對各類各樣奇葩無聊的參數請求了。固然在這仍是要說的是,這裏的關鍵字參數命名不必定要是 kwargs,但這個是一般作法。
更多內容,歡迎關注公衆號「Python空間」,期待和你的交流。