函數的參數

在定義Python函數時可定義形參,這些參數在調用時候才能確定具體的值,由函數的調用者負責為行參傳入參數值

函數的參數類型

一、 位置參數

也叫必傳參數,順序參數,是最重要的,也是必須在調用函數時明確提供的參數!位置參數必須按先后順序,一一對應,個數不多不少的傳遞!

Python函數學習-參數類型_第1張圖片

說明:a,b,c是函數add的行參,沒有具體的值,只有在add(x,y,z)是才被傳入值,a=x=1,b=y=2,c=z=3, 其中x,y,z叫做實參,add(4,5,6,7),add(5,7)均為錯誤調用

二、關鍵字參數

在調用函數的時候,傳遞的參數是根據參數名傳值,不必按照定義形參的順序傳遞的參數叫做關鍵字參數

Python函數學習-參數類型_第2張圖片

說明:在出傳遞參數時明確指定a=1,c=10,b=3,這樣傳遞這三個變量先后順序可以隨意調換,add(0, 3, c=10)中,既有位置參數又有關鍵字參數,位置參數必須放到關鍵字參數前面否則報錯

Python函數學習-參數類型_第3張圖片

三、默認參數

在定義函數的時候,如果給某個參數提供一個默認值,這個參數就變成了默認參數,不再是位置參數了。在調用函數的時候,我們可以給默認參數傳遞一個自定義的值,也可以使用默認值。

Python函數學習-參數類型_第4張圖片

說明:add( 0, 3 )沒有給c傳值,使用默認傳值3

  • 默認參數必須在位置參數后面!

                    
                      def add(c=2, a, b):此種定義函數的方法是錯誤的
                    
                  
  • 默認參數盡量指向不變的對象!

Python函數學習-參數類型_第5張圖片

說明:上面的答案可能與你想的不一樣,為什么呢?應為在定義默認函數時,a 為一個可變變量,在函數體被讀入內存的時候,默認參數a指向的空列表對象就會被創建,a的內存地址不變,每次調用函數都像a變量中添加A

動態參數

定義: 顧名思義,就是參數的個數是可以變的,這樣在調用函數的時候可以傳入任意多個參數
動態參數的兩種方式:
1.*args:一個星號表示接收任意個參數。調用時,會將實際參數打包成一個元組傳入形式參數。如果傳遞的是列表,列表將被當做一個整體
2.**kwargs:兩個星表示接受鍵值對的動態參數,數量任意。調用的時候會將實際參數打包成字典
.*args和**kwargs是約定俗成的參數名稱,也可以隨便寫成其他任何符合命名規范的參數名稱

*args:舉例子**

            
              def test(*books):
    print(books)
    for i in  books:
        print(i)

books = [ "西游記", "三國演義", "水滸傳" ]

test("西游記", "三國演義", "水滸傳" )

test(books)
            
          

輸出結果

            
              ('西游記', '三國演義', '水滸傳')
西游記
三國演義
水滸傳
(['西游記', '三國演義', '水滸傳'],)
['西游記', '三國演義', '水滸傳']

            
          

說明:上邊的例子中*books為定義的一個可變參數,調用函數的時候可以傳遞多個參數,print(books)可以查看數此參數為一個元組,books列表被當做一個整體傳入

問題:能不能讓列表它內部的('西游記', '三國演義', '水滸傳')分別當做參數傳遞進去

答案:當然可以,就是在傳遞列表參數的時候在前面添加一個星號

            
              def test(*books):
    print(books)
    for i in  books:
        print(i)

books = [ "西游記", "三國演義", "水滸傳" ]
test(books)
            
          

結果:

            
              (['西游記', '三國演義', '水滸傳'])
西游記
三國演義
水滸傳

            
          

** kwargs:舉例說明

            
              def func(**kwargs):
    print(type(kwargs))
    for kwg in kwargs:
        print(kwg, kwargs[kwg])

func(k1='v1', k2=[0, 1, 2])
            
          

輸出結果:

            
              
                
k1 v1
k2 [0, 1, 2]

              
            
          

思考一下代碼結果是什么:

            
              def func(**kwargs):
    print(type(kwargs))
    for kwg in kwargs:
        print(kwg, kwargs[kwg])

core = {
    "語文": 81,
    "數學": 92

}
func(core)
            
          

結果:

            
              D:\project\test\venv\Scripts\python.exe D:/project/test/venv/monster.py
Traceback (most recent call last):
  File "D:/project/test/venv/monster.py", line 87, in 
              
                
    func(core)
TypeError: func() takes 0 positional arguments but 1 was given

Process finished with exit code 1
              
            
          

分析:

由于**kwargs需要傳遞鍵值對的參數,雖然字典是鍵值對的值,但是單獨傳遞字典名的時候會將字典當做位置參數傳遞,那有什么辦法將字典以鍵值對的方式當做多個參數傳遞呢?

答案:在傳遞字典的前面添加兩個星號

            
              func(**core)

            
          

正確結果:

            
              
                
語文 81
數學 92