Python 中函數的參數類型比較豐富,好比咱們常常見到 *args
和 **kwargs
做爲參數。初學者遇到這個多少都有點懵逼,今天咱們來把 Python 中的函數參數進行分析和總結。python
在Python中定義函數參數有5種類型,咱們來一一演示它們。數組
必須參數是最基本的參數類型,當你在 Python 函數中定義一個必選參數時,每次調用都必須給予賦值,不然將報錯。app
>>>def fun(a): print("a=",a) >>>fun('felord.cn') a= felord.cn >>>fun() Traceback (most recent call last): File "<input>", line 1, in <module> TypeError: fun() missing 1 required positional argument: 'a'
默認參數就是擁有一個默認值的參數。函數
>>>def fun(a="felord.cn"): print("a=",a) >>>fun() a= felord.cn >>>fun("Felordcn") a= Felordcn
咱們來看看下面這種狀況:學習
>>>def fun(a=[]): a.append("foo") print("a=",a) >>>fun() a= ['foo'] >>>fun() a= ['foo', 'foo'] >>>fun() a= ['foo', 'foo', 'foo']
這是什麼狀況?每次調用參數 a
都「記憶」了原來的值,這是由於 Python 函數在定義的時候,默認參數a
的值就被初始化爲[]
,其實a
也是一個變量,它指向對象[]
,每次調用該函數改變 a
的值則會改變 a
指針指向的對象的值。當你將 a
的默認值定義爲一個不可變對象時就不會發生這種狀況,你能夠試試我說的。測試
因此,定義默認參數要牢記一點:默認參數必須指向不變對象!
有不少場景咱們不肯定參數的個數,也就是說參數是可變的。首先你可能會想到使用 list
或者 tuple
(元組)來封裝多個參數,可是如何才能從函數的語義上看出這是一個可變參數呢?因此咱們經過一個前綴標識 *
來聲明該參數是一個可變參數,一般記做 *args
,你也能夠記做 *params
。args
會把全部的參數收納成一個 tuple
。咱們來演示一個求和的函數:ui
>>>def calc(*args): total=0 for i in args: total+=i return total >>>calc(1) 1 >>>calc(1,2,3,4,5) 15 >>>calc() 0
關鍵字參數也是實現任意個數參數的一種方式,區別在於可變參數收納爲一個 tuple
而關鍵字參數將咱們傳入參數的參數名和對應的值收納爲一個dict
(字典)。一般記做 **kwargs
以區別於可變參數,實際上 kw
就是 keyword
的縮寫。咱們來試一試:指針
>>>def mapper(**kwargs): print(kwargs) >>>mapper() {} >>>mapper(name="felord.cn") {'name': 'felord.cn'}
對於關鍵字參數,函數的調用者能夠傳入任意不受限制的關鍵字參數。至於到底傳入了哪些關鍵字,須要咱們在函數內部進行顯式的檢查來肯定,這種樣板代碼每每跟咱們的意圖無關。那麼 Python 自己能不能限制關鍵字參數的名字呢?固然有!咱們可使用命名關鍵字參數來實現這個目的。在 *,
以後緊跟的連續的非可變參數和非關鍵字參數就是命名關鍵字參數。咱們也來演示一下:code
>>>def info(name,*,age,city): print("name=",name,"age=",age,"city=",city) >>>info("felord.cn") Traceback (most recent call last): File "<input>", line 1, in <module> TypeError: info() missing 2 required keyword-only arguments: 'age' and 'city' >>>info("felord.cn",city="beijing",age=20) name= felord.cn age= 20 city= beijing
根據上面你或許能發現其它什麼規律,另外命名關鍵字參數也能夠設置關鍵字的默認值,可是傳參必須帶 keyword對象
>>>def info(name,*,age=20,city): print("name=",name,"age=",age,"city=",city) >>>info("felord.cn",city="beijing") name= felord.cn age= 20 city= beijing >>>info("felord.cn","beijing") Traceback (most recent call last): File "<input>", line 1, in <module> TypeError: info() takes 1 positional argument but 2 were given
這5種參數能夠組合使用,參數定義的順序必須是:必選參數、默認參數、可變參數/命名關鍵字參數和關鍵字參數。特別注意可變參數沒法和命名關鍵字參數混合。對於任意函數,均可以經過相似 function(args, *kw)
的形式調用它,不管它的參數是如何定義的。限於篇幅再也不一一舉例,可自行測試。
Python 的函數具備很是靈活的參數形態,既能夠實現簡單的調用,又能夠傳入很是複雜的參數。其中也有很多細節,參數類型也是學習 Python 函數的一個關鍵知識點。
關注公衆號:Felordcn 獲取更多資訊