1. 程式人生 > 程式設計 >python 函式中的引數型別

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

,你也可以記作*paramsargs會把所有的引數收納成一個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 函式中的引數型別,希望對大家有所幫助!