Python中*args 和**kwargs作為形參和實參時的功能詳解


*args 和**kwargs作為形參

*args 和**kwargs作為形參被稱為不定長參數,用來處理超出必備參數部分的參數。注意:args和kwargs可以修改為其它變量名。

必備參數就是在定義函數時傳入的形參,在調用函數時,傳入的參數須以正確的順序傳入,傳入的數量必須和聲明時的一樣,不然會出現語法錯誤。

以下為必備參數語法錯誤實例:

def student(name, age):
  print(name, age)
student() """ Traceback (most recent call last): File "D:/test.py", line 5, in <module> student() TypeError: student() missing 2 required positional arguments: 'name' and 'age' """ student("張三", 11, 99) """ Traceback (most recent call last): File "D:/test.py", line 5, in <module> student("張三",11, 99) TypeError: student() takes 2 positional arguments but 3 were given """

當傳入的參數超出必備參數時,若不想出現語法錯誤,可以使用不定長參數來接收這些多余的參數,若多余的參數類型為值(值為自定義說法,指的是沒有”=“連接,單獨的一個值,這個值可以是任何類型str,list,dict等),則被*args以元組類型接收

若多余的參數類型為鍵值(鍵值為自定義說法,指的是一個參數用”=“連接一個值,這個值可以是任何類型str,list,dict等),則被**kwargs以字典類型接收。

def student(name, age, *args, **kwargs):
    print("必備參數:", name, age)
    print("多余的“值”參數:", args)
    print("多余的“鍵值”參數:", kwargs)


student("張三", 11, 22, [33, 44], {"語文": 55}, score=66, evaluation={"數學": ""})

"""
輸出結果如下:
必備參數: 張三 11
多余的“值”參數: (22, [33, 44], {'語文': 55})
多余的“鍵值”參數: {'score': 66, 'evaluation': {'數學': '優'}}
"""

*args 和**kwargs作為實參

接收到這些多余的參數,怎么傳遞給其它函數用呢?傳遞時是使用帶星的還是不帶星呢?

先看不帶*的實例:

def summary_student(name, *score, **evaluation):
    print("-"*20)
    print("必備參數:", name)
    print("多余的“值”參數:", score)
    print("多余的“鍵值”參數:", evaluation)


def student(name, age, *args, **kwargs):
    print("args變量的值:", args)
    print("kwargs變量的值:", kwargs)
    summary_student(name, age, args, kwargs)


student("張三", 11, 22, [33, 44], {"語文": 55}, score=66, evaluation={"數學": ""})

"""
輸出結果如下:
args變量的值: (22, [33, 44], {'語文': 55})
kwargs變量的值: {'score': 66, 'evaluation': {'數學': '優'}}
--------------------
必備參數: 張三
多余的“值”參數: (11, (22, [33, 44], {'語文': 55}), {'score': 66, 'evaluation': {'數學': '優'}})
多余的“鍵值”參數: {}
"""

從上面實例多余的參數分析,多余參數傳遞給其它函數使用時,若不帶*,實際上就是把變量args整個元組當成一個值傳遞給其它函數使用,同理kwargs也會被當做一個值處理。

在看下帶*的實例:

def summary_student(name, *score, **evaluation):
    print("-"*20)
    print("必備參數:", name)
    print("多余的“值”參數:", score)
    print("多余的“鍵值”參數:", evaluation)


def student(name, age, *args, **kwargs):
    print("args變量的值:", args)
    print("kwargs變量的值:", kwargs)
    summary_student(name, age, *args, **kwargs)


student("張三", 11, 22, [33, 44], {"語文": 55}, score=66, evaluation={"數學": ""})

"""
輸出結果如下:
args變量的值: (22, [33, 44], {'語文': 55})
kwargs變量的值: {'score': 66, 'evaluation': {'數學': '優'}}
--------------------
必備參數: 張三
多余的“值”參數: (11, 22, [33, 44], {'語文': 55})
多余的“鍵值”參數: {'score': 66, 'evaluation': {'數學': '優'}}
"""

從上面實例多余的參數分析,多余參數傳遞給其它函數使用時,若帶*,其它函數處理時,全部按原傳入參數的類型處理,原傳入參數為”值“類型就讓其它函數的*args接收,原傳入參數為"鍵值"類型就讓其它函數的**kwargs接收。

也就是說 *args 和**kwargs作為實參時,具有拆包的作用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM