*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作為實參時,具有拆包的作用。