python 函式中的引數型別
1.前言
Python中函式的引數型別比較豐富,比如我們經常見到*args
和**kwargs
作為引數。初學者遇到這個多少都有點懵逼,今天我們來把Python中的函式引數進行分析和總結。
2.Python 中的函式引數
在Python中定義函式引數有5種類型,我們來一一演示它們。
2.1必選引數
必須引數是最基本的引數型別,當你在Python函式中定義一個必選引數時,每次呼叫都必須給予賦值,否則將報錯。
>>>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'
2.2預設引數
預設引數就是擁有一個預設值的引數。
>>>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
的預設值定義為一個不可變物件時就不會發生這種情況,你可以試試我說的。
所以,定義預設引數要牢記一點:預設引數必須指向不變物件!
2.3可變引數
有很多場景我們不確定引數的個數,也就是說引數是可變的。首先你可能會想到使用list
或者tuple
(元組)來封裝多個引數,但是如何才能從函式的語義上看出這是一個可變引數呢?所以我們通過一個字首標識*
來宣告該引數是一個可變引數,通常記作*args
*params
。args
會把所有的引數收納成一個tuple
。我們來演示一個求和的函式:
>>>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
2.4關鍵字引數
關鍵字引數也是實現任意個數引數的一種方式,區別在於可變引數收納為一個tuple
而關鍵字引數將我們傳入引數的引數名和對應的值收納為一個dict
(字典)。通常記作**kwargs
以區別於可變引數,實際上kw
就是keyword
的縮寫。我們來試一試:
>>>def mapper(**kwargs): print(kwargs) >>>mapper() {} >>>mapper(name="felord.cn") {'name': 'felord.cn'}
2.5命名關鍵字引數
對於關鍵字引數,函式的呼叫者可以傳入任意不受限制的關鍵字引數。至於到底傳入了哪些關鍵字,需要我們在函式內部進行顯式的檢查來確定,這種樣板程式碼往往跟我們的意圖無關。那麼Python本身能不能限制關鍵字引數的名字呢?當然有!我們可以使用命名關鍵字引數來實現這個目的。在*,
之後緊跟的連續的非可變引數和非關鍵字引數就是命名關鍵字引數。我們也來演示一下:
>>>def info(name,*,age,city): print("name=",name,"age=","city=",city) >>>info("felord.cn") Traceback (most recent call last): File "<input>",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) >>>info("felord.cn",city="beijing") name= felord.cn age= 20 city= beijing >>>info("felord.cn","beijing") Traceback (most recent call last): File "<input>",in <module> TypeError: info() takes 1 positional argument but 2 were given
3.引數組合
這5種引數可以組合使用,引數定義的順序必須是:必選引數、預設引數、可變引數/命名關鍵字引數和關鍵字引數。特別注意可變引數無法和命名關鍵字引數混合。對於任意函式,都可以通過類似function(args,*kw)
的形式呼叫它,無論它的引數是如何定義的。限於篇幅不再一一舉例,可自行測試。
4. 總結
Python的函式具有非常靈活的引數形態,既可以實現簡單的呼叫,又可以傳入非常複雜的引數。其中也有不少細節,引數型別也是學習Python函式的一個關鍵知識點
以上所述是小編給大家介紹的python 函式中的引數型別,希望對大家有所幫助!