引入
用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)。
- 基本用法
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)
- 送入參數爲list的情況
但是,要注意,如果我們送入的實際參數是一個列表,則它只認爲我們送入了一個參數,比如:
a = [1, "two", 3]
test_var_args(a)
得到的輸出爲:
('arg:', [1, 'two', 3])
- 送入參數時使用*的用法
爲了把list中的數據作爲參數送入,我們就需要在參數前面加上星號了,比如:
a = [1, "two", 3]
test_var_args(*a)
得到的輸出就是多個參數,如下(區別於上例):
('arg:', 1)
('arg:', 'two')
('arg:', 3)
這種在list前面加上星號的用法,就是本文開頭問題中的用法。
**kwargs的用法
**kwargs與*args用法大致相同,都是用在函數的參數定義中,用於接受一個可變長度的參數列表。但是,**kwargs能接受帶key-value這樣的參數(比如dict)。
- 基本用法
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
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
- 送入參數時使用**的用法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/