详解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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章