【1】位置參數
從前面的學習的案例我們會發現一個規律:函數調用時,實參默認按位置順序進行傳遞,並且要求個數和形參完全匹配。這就是位置參數!
# 位置參數def postion_fun(a,b,c):print("a = {0},b = {1},c = {2}".format(a,b,c))postion_fun(10,59,2019)postion_fun(10,59)
案例中的函數定義一個列印接收到的三個參數值。一次調用函數時傳入三個實參,另一次調用則只傳入兩個實參。
我們看看執行的效果:
傳入三個參數的調用成功,並且實參對應函數形參的位置被列印出來;傳入兩個參數的調用失敗,Python彈出「缺少一個參數c」的報錯信息。【2】默認參數
針對位置參數少傳一個參數報錯的問題,我們是否可以設置一個默認的值呢?這樣在函數調用時不用傳入該參數時也不會報錯。這就是「默認參數」。
# 默認參數def default_fun(a,b,c = 2019):print("a = {0},b = {1},c = {2}".format(a,b,c))default_fun(10,59,"職說職語")default_fun(10,59)
案例中的函數定義一個列印接收到的三個參數值,其中一個參數設置了默認值。一次調用傳入三個參數,另一次調用傳入兩個參數。
看到執行結果我們看到兩次調用都是成功的。
函數調用傳入三個參數時,按實參與形參的位置對應關係列印三個實參的值;函數調用傳入兩個參數時,按實參與形參的位置對應關係列印兩個實參的值和函數定義的一個默認形參值。【注】函數定義默認參數時,默認參數的位置必須在最後,否則報錯。大家可以自己去測試下。
【3】命名參數
針對位置參數與默認參數調用必須實參與形成位置對應的要求,我們是否可以在調用時制定形參的具體實參值,來規避違背這種要求帶來的問題呢?
【結論】採用指定形參的具體實參值是可以增加函數調用的靈活性。
postion_fun(c = 10,b = 59, a = 2019)
【4】可變參數
上面三種參數類型中單個參數都是針對單個的值。如果函數的單個參數中包含多個值(元組、字典等)該如何處理呢?
Python中引入了「可變數量的參數」這個概念:
1、元組參數:
【結論】:在函數定義時,用*param(一顆星號)表示收集多個參數值組成一個元組。
2、字典參數:
# 字典參數def tuple_fun2(a,b,**c): print("a = {0},b = {1},c = {2}".format(a,b,c))tuple_fun2(10,59,name="職說職語",job="自由工作者")
【結論】:在函數定義時,用**param(兩顆星號)表示收集多個參數值組成一個字典。
3、元組與字典參數融合:
# 元組與字典參數def tuple_fun3(a,b,*c,**d): print("a = {0},b = {1},c = {2},d = {3}".format(a,b,c,d))tuple_fun3(10,59,2019,"職說職語",name="職說職語",job="自由工作者")
【結論】兩種參數都可以出現在一個函數中,並且安裝實參與形參的對應位置進行結果組裝。
【5】強制命名參數
最後針對可變參數,我們問最後一個問題:可變參數在函數定義時是否可以放置任意位置呢?函數調用時是否有什麼要求呢?
# 強制命名參數def tuple_fun4(*a,b,c): print("a = {0},b = {1},c = {2}".format(a,b,c))tuple_fun4(10,59,2019,"職說職語")tuple_fun4(10,59,b = 2019,c = "職說職語")tuple_fun4(10,b = 2019,c = "職說職語")
定義函數時把元組參數放到最前面,那調用函數時,該參數默認是收集所有傳入的實參後組成元組,如果要是後面兩個參數有值並保證函數調用正常,則必須採用強制命名參數方式制定實參傳入形參的值。
【問題】兩個可變參數是否可以都放置前面呢?大家可以去測試下。