函數的*args和**kwargs

*args

  • *args是爲了傳入任意不定數量的參數
  • 全部的不定參數都在args裏面,造成一個tuple傳入函數內部
  • *args通常用在關鍵字參數後面
def func(a,*args):
    print(type(args))
    print(args)
    print(a)
    
>>>func(1)
<class 'tuple'>
()
1

>>>func(10,2,'a')
<class 'tuple'>
(2, 'a')
10

>>>func(1,2,m=3)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: func() got an unexpected keyword argument 'm'

args參數不能接收關鍵字,只須要直接傳參數值。接收關鍵字的是後續的*kwargspython

**kwargs

  • **kwargs是爲了傳入任意不定數量的關鍵字參數
  • 最後傳入的不定數量的關鍵字參數都在kwargs裏面,造成一個dict傳入函數
  • **kwargs只能放在函數最後一個參數。
  • 函數參數的通常順序是:關鍵字參數,args,*kwargs
def func(x,y,*t,**test):
    print(type(test))
    print(test.keys())
    print(test.values())
    res1=sum(t)
    res2=sum(test.values())
    print('res1:%s'%(res1))
    print('res2:%s'%(res2))
    return res1,res2

>>>func(1,2,10,20,m=100,n=200)
<class 'dict'>
dict_keys(['m', 'n'])
dict_values([100, 200])
res1:30
res2:300

>>>func(1,2,10,20,30,m=100,n=200,k=-100,g=-200)
<class 'dict'>
dict_keys(['m', 'n', 'k', 'g'])
dict_values([100, 200, -100, -200])
res1:60
res2:0

使用場景

一個頗有用的使用場景(在一個函數內部調用另外一個函數):函數

定義一個函數func,實現某種功能(好比求兩數之和)。而項目有特殊要求,須要對結果進行各類檢驗(類型檢驗,大小檢驗等等),須要對結果調用check_data()函數。如代碼所示:code

import check_data
def func(x,y,*args,**kwargs):
    data=x+y
    is_valid=check_data(*args,**kwargs)
    if is_valid:
        return data
       else:
        raise Exception('data is not valid')

這種時候,x和y是關鍵字參數,主要用在函數內部進行相應功能的實現。而args和*kwargs則是不定參數,但這裏專門用來傳入check_data中。input

這樣作的好處:若是check_data裏面有不少參數須要傳遞,大部分是使用默認值,這個時候若是在func()函數裏都寫出來會很是冗餘,使用函數很是不清晰。經過這種方式,能夠在使用時將參數重點放在關鍵字參數上,而若對check_data函數有特殊設置,再對有特殊設置的參數經過args和*kwargs傳進去。靈活且簡潔。io

這種使用方式須要注意的是args或者*kwargs只用在一個函數或類上。用於多個極易混淆出錯。ast