Python中的*args與**kwargs
阿新 • • 發佈:2019-02-07
說明
在再談二者區別前,先要說明的是,語法的區別是* 和** 這兩個符號影響,而*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'}
從上面的例子,我們總結如下幾點:
*args 和**kwargs可以單獨使用
*args和**kwargs可以一起使用
一起使用時,*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'}
從上面的例子,我們總結如下幾點:
*會把list或者tuple分解為一個個引數傳遞給函式
**會把dict轉成關鍵字引數
函式定義和函式呼叫,可以同時出現*或者**,如foo3
出現在函式呼叫時,一定要注意引數匹配問題