初學Python的同學們看到代碼中類似func(*args, **kwargs)這樣的函數參數定義時,經常感到一頭霧水。
下面通過一個簡單的例子來詳細解釋下Python函數可變參數*args及**kwargs,先給出標准答案:
1. *args是arguments單詞縮寫,表示任意多個無名參數,是一個tuple,如 (1,2,3,'a','b','c')
2. **kwargs是keyword arguments單詞縮寫,表示關鍵字參數,是一個dict,如{'a':1,'b':2,'c':3}
示例代碼:
# coding:utf-8 def foo(*args,**kwargs): print 'args=',args print 'kwargs=',kwargs print '*'*20 if __name__=='__main__': #只傳參數*args=(1,2,3) foo(1,2,3) #只傳參數**kwargs=dict(a=1,b=2,c=3) foo(a=1,b=2,c=3) #傳入參數*args=(1,2,3) #傳入參數**kwargs=dict(a=1,b=2,c=3) foo(1,2,3,a=1,b=2,c=3) #傳入參數*args=(1,'b','c') #傳入參數**kwargs=dict(a=1,b='b',c='c') foo(1,'b','c',a=1,b='b',c='c')
運行結果:
args= (1, 2, 3) kwargs= {} ******************** args= () kwargs= {'a': 1, 'c': 3, 'b': 2} ******************** args= (1, 2, 3) kwargs= {'a': 1, 'c': 3, 'b': 2} ******************** args= (1, 'b', 'c') kwargs= {'a': 1, 'c': 'c', 'b': 'b'} ********************
需要注意的是,當同時使用*args和**kwargs時,*args參數必須在**kwargs前。要是像foo(1,a=1,b=2,c=3,2,3)這樣調用的話,則會提示語法錯誤"SyntaxError: non-keyword arg after keyword arg"。
