python 函數中的參數類型

1.前言

Python 中函數的參數類型比較豐富,好比咱們常常見到 *args**kwargs 做爲參數。初學者遇到這個多少都有點懵逼,今天咱們來把 Python 中的函數參數進行分析和總結。python

2.Python 中的函數參數

在Python中定義函數參數有5種類型,咱們來一一演示它們。數組

2.1必選參數

必須參數是最基本的參數類型,當你在 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'

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。咱們來演示一個求和的函數: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

2.4關鍵字參數

關鍵字參數也是實現任意個數參數的一種方式,區別在於可變參數收納爲一個 tuple 而關鍵字參數將咱們傳入參數的參數名和對應的值收納爲一個dict (字典)。一般記做 **kwargs 以區別於可變參數,實際上 kw 就是 keyword的縮寫。咱們來試一試:指針

>>>def mapper(**kwargs):
       print(kwargs)
    
>>>mapper()
{}
>>>mapper(name="felord.cn")
{'name': 'felord.cn'}

2.5命名關鍵字參數

對於關鍵字參數,函數的調用者能夠傳入任意不受限制的關鍵字參數。至於到底傳入了哪些關鍵字,須要咱們在函數內部進行顯式的檢查來肯定,這種樣板代碼每每跟咱們的意圖無關。那麼 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

3.參數組合

這5種參數能夠組合使用,參數定義的順序必須是:必選參數、默認參數、可變參數/命名關鍵字參數和關鍵字參數。特別注意可變參數沒法和命名關鍵字參數混合。對於任意函數,均可以經過相似 function(args, *kw) 的形式調用它,不管它的參數是如何定義的。限於篇幅再也不一一舉例,可自行測試。

4. 總結

Python 的函數具備很是靈活的參數形態,既能夠實現簡單的調用,又能夠傳入很是複雜的參數。其中也有很多細節,參數類型也是學習 Python 函數的一個關鍵知識點。

關注公衆號:Felordcn 獲取更多資訊

我的博客:https://felord.cn

相關文章
相關標籤/搜索