詳解python中的*args與**kwargs的用法

引入

用itertools做多個item的組合問題,使用方式如下

import itertools
all_list = [['A', 'B'], ['C', 'D'], ['E','F']]
list(itertools.product(*all_list))

這段代碼會生成三個list中元素的組合結果,如下所示:

[('A', 'C', 'E'),
 ('A', 'C', 'F'),
 ('A', 'D', 'E'),
 ('A', 'D', 'F'),
 ('B', 'C', 'E'),
 ('B', 'C', 'F'),
 ('B', 'D', 'E'),
 ('B', 'D', 'F')]

具體的組合邏輯,我們這裏不討論。細心的讀者可以會發現下面這種“星號加參數”用法:

itertools.product(*all_list)

我們在很多python代碼中,都會看到這種用法。一個星號加上一個list,是什麼意思呢?

*args的用法

*args主要用在函數的參數定義中,它表示用於接受一個可變長度的參數列表,它不接受帶key-value這樣的參數(比如dict)。

  1. 基本用法
def test_var_args(*args):
    for arg in args:
        print("arg:", arg)

test_var_args(1, "two", 3)

得到的輸出如下,*args可以接受我們所有的變長參數:

('arg:', 1)
('arg:', 'two')
('arg:', 3)
  1. 送入參數爲list的情況

但是,要注意,如果我們送入的實際參數是一個列表,則它只認爲我們送入了一個參數,比如:

a = [1, "two", 3]
test_var_args(a)

得到的輸出爲:

('arg:', [1, 'two', 3])
  1. 送入參數時使用*的用法

爲了把list中的數據作爲參數送入,我們就需要在參數前面加上星號了,比如:

a = [1, "two", 3]
test_var_args(*a)

得到的輸出就是多個參數,如下(區別於上例):

('arg:', 1)
('arg:', 'two')
('arg:', 3)

這種在list前面加上星號的用法,就是本文開頭問題中的用法。

**kwargs的用法

**kwargs與*args用法大致相同,都是用在函數的參數定義中,用於接受一個可變長度的參數列表。但是,**kwargs能接受帶key-value這樣的參數(比如dict)。

  1. 基本用法
def test_var_kwargs( **kwargs ):
    for key in kwargs:
        print("%s: %s" % (key, kwargs[key]))

test_var_kwargs(farg=1, myarg2="two", myarg3=3)

得到的輸出如下:

farg: 1
myarg2: two
myarg3: 3
  1. 送入參數時使用**的用法1
def test_var_kwargs( **kwargs ):
    for key in kwargs:
        print("%s: %s" % (key, kwargs[key]))
a = {'farg':1, 'myarg2':"two", 'myarg3':3}
test_var_kwargs(**a)

與上面的*args的用法例子中第3種用法類似,這裏也想把dict中的實際數據作爲參數送給函數,所以需要在實際的dict前面加上**。

得到的輸出爲:

farg: 1
myarg2: two
myarg3: 3
  1. 送入參數時使用**的用法2

可以給固定參數的函數中傳入一個dict的實際數據,如下所示:

def test_var_args_call(arg1, arg2, arg3):
    print("arg1:", arg1)
    print("arg2:", arg2)
    print("arg3:", arg3)

kwargs = {"arg3": 3, "arg2": "two"}
test_var_args_call(1, **kwargs)

用法與上例類似,得到的輸出爲:

('arg1:', 1)
('arg2:', 'two')
('arg3:', 3)

總結

**kwargs與*args用法大致相同,都是用在函數的參數定義中,用於接受一個可變長度的參數列表。

但是,**kwargs能接受帶key-value這樣的參數(比如dict),而*args不接受這樣帶key-value的參數。

參考

  • [1] https://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/
發佈了190 篇原創文章 · 獲贊 259 · 訪問量 122萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章