1. 程式人生 > >Python中的*args與**kwargs

Python中的*args與**kwargs

說明

在再談二者區別前,先要說明的是,語法的區別是* 和** 這兩個符號影響,而*args和**kwargs只是約定的非強制性的。就使用場景而言,可以分為在function definition和function call來討論

function definition

出現在函式定義時,當我們不確定函式的引數個數時,*args允許你傳入任意數量的引數,**kwargs可以傳入任意數量的關鍵字引數,具體如何使用,又如何表現? 我們先分析程式碼:

def foo1(*args):
    print args

foo1('a', 'b', [1, 2, 'c'])
# output: ('a', 'b', [1, 2, 'c'])
def foo2(**kwargs): print kwargs foo2(name='zz', address='yy', id=[1,2]) # output: {'id': [1, 2], 'name': 'zz', 'address': 'yy'} def foo3(i, *args, **kwargs): print i, args, kwargs foo3(1) # output: 1 () {} foo3(1, 2, 3) # output: 1 (2, 3) {} foo3(1, name='zz', address='yy') # output: 1 () {'name': 'zz', 'address': 'yy'}
foo3(1, 2, 3, name='zz', address='yy') # output: 1 (2, 3) {'name': 'zz', 'address': 'yy'}

從上面的例子,我們總結如下幾點:

  1. *args 和**kwargs可以單獨使用

  2. *args和**kwargs可以一起使用

  3. 一起使用時,*args必須在**kwargs前面

function call

出現在函式呼叫時,*會把list或者tuple的元素unpack,作為一個個引數傳遞,而**會把dict作為關鍵字引數傳遞,需要注意的是,unpack後的引數數目要和函式定義保持一致,看如下幾個例子:

def
foo1(a, b, c):
print a, b, c i = [1, 2, 3] foo1(*i) # output: 1 2 3 def foo2(a, b, c=9): print a, b, c d = {'b': 2, 'a': 3} foo2(**d) # output: 3 2 9 def foo3(a, b, *args, **kwargs): print a, b, args, kwargs a = [1, 2, 3, 4, 5, 6] b = {'name': 'xx', 'address': 'yy'} foo3(*a, **b) # output: 1 2 (3, 4, 5, 6) {'name': 'xx', 'address': 'yy'}

從上面的例子,我們總結如下幾點:

  1. *會把list或者tuple分解為一個個引數傳遞給函式

  2. **會把dict轉成關鍵字引數

  3. 函式定義和函式呼叫,可以同時出現*或者**,如foo3

  4. 出現在函式呼叫時,一定要注意引數匹配問題