引入
用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/