學習python裝飾器decorator的時候遇到*args和**kw兩種函數值傳遞。
在python中定義函數,可以使用一般參數、默認參數、非關鍵字參數和關鍵字參數。
一般參數和默認參數在前面的學習中我們都遇到過了,而*args和**kw分別屬於非關鍵字參數和關鍵字參數,后兩者也都是可變參數。
非關鍵字參數的特征是一個星號*加上參數名,比如*number,定義后,number可以接收任意數量的參數,並將它們儲存在一個tuple中。
關鍵字參數的特征是兩個星號**加上參數名,比如**kw, 定義后,kw將接收到的任意數量參數存到一個dict中。關鍵字參數是在傳遞構成中不必按照順序傳遞(因為dict內的key-value是沒有順序的),但必須要提供”傳遞參數名=傳遞參數值”形式的參數。
如:
def try_it(*args, **kw): print 'args:',args print 'kw:',kw try_it(1,2,3,4, a=1,b=2,c=3) try_it('a', 1, None, a=1, b='2', c=3)
運行結果:
args: (1, 2, 3, 4) kw: {'a': 1, 'c': 3, 'b': 2} args: ('a', 1, None) kw: {'a': 1, 'c': 3, 'b': '2'}
python中的一般參數、默認參數、非關鍵字參數和關鍵字參數可以一起使用,或者只用其中某些,但是請注意,參數定義的順序必須是:一般參數、默認參數、可變參數和關鍵字參數,先后順序不能顛倒。即:
def func(a, b, c=0, *args, **kw):
pass
例子:
我們用到函數’calculate_sum’,但’calculate_sum’需要多個位置參數作為元組傳給’args’。所以在函數’ignore_first_calculate_sum’需要拆元組’iargs’,然后將元素作為位置參數傳給’calculate_sum’.注意,用’*’拆元組。
所以,我們這樣調用’required_sum=calculate_sum(*iargs)’.
‘required_sum=calculate_sum(iargs)’不能這么調用,因為傳給’calculate_sum’之前我們需要unpack數值。不使用’*’將不會unpack數值,也就不能執行想要的動作。
def calculate_sum(*args): return sum(args) def ignore_first_calculate_sum(a,*iargs): required_sum = calculate_sum(*iargs) print ("sum is ", required_sum) ignore_first_calculate_sum(12, 1,4,5)
參考:csdn
