理解python中s可变参数的*args和**kwargs

使用默认参数的可变参数

python是支持可变参数的,最简单的方法莫过于使用默认参数,例如:

def test_defargs(one, two = 2):
print ‘required argument: ‘, one
print ‘optional argument: ‘, two
test_defargs(1)
# result:
# required argument: 1
# optional argument: 2
test_defargs(1, 3)
# result:
# required argument: 1
# optional argument: 3

在函数定义时使用*args和**kwargs

当然,本文主要讲一种达到可变参数 (variable argument) 的方法:使用*args和**kwargs语法。其中,*args是可变的positional arguments列表,**kwargs是可变的keyword arguments列表。并且,*args必须位于**kwargs之前,因为positional arguments必须位于keyword arguments之前。

首先介绍两者的基本用法。

下面一个例子使用*args,同时包含一个必须的参数:

def test_args(first, *args):
print ‘required argument: ‘, first
for v in args:
print ‘optional argument: ‘, v
test_args(1, 2, 3, 4)
# result:
# required argument: 1
# optional argument: 2
# optional argument: 3
# optional argument: 4

下面一个例子使用*kwargs, 同时包含一个必须的参数和*args列表:

def test_kwargs(first, *args, **kwargs):
print ‘required argument: ‘, first
for v in args:
print ‘optional argument (*args): ‘, v
for k, v in kwargs.items():
print ‘optional argument %s (*kwargs): %s’ % (k, v)
test_kwargs(1, 2, 3, 4, k1=5, k2=6)
# results:
# required argument: 1
# optional argument (*args): 2
# optional argument (*args): 3
# optional argument (*args): 4
# optional argument k2 (*kwargs): 6
# optional argument k1 (*kwargs): 5

在函数调用时,使用*args和**kwargs

*args和**kwargs语法不仅可以在函数定义中使用,同样可以在函数调用的时候使用。不同的是,如果说在函数定义的位置使用*args和**kwargs是一个将参数pack的过程,那么在函数调用的时候就是一个将参数unpack的过程了。下面使用一个例子来加深理解:

def test_args(first, second, third, fourth, fifth):
print ‘first argument: ‘, first
print ‘second argument: ‘, second
print ‘third argument: ‘, third
print ‘fourth argument: ‘, fourth
print ‘fifth argument: ‘, fifth
# use *args
args = [1, 2, 3, 4, 5]
test_args(*args)
# results:
# first argument: 1
# second argument: 2
# third argument: 3
# fourth argument: 4
# fifth argument: 5
# use **kwargs
kwargs = {
‘first’: 1,
‘second’: 2,
‘third’: 3,
‘fourth’: 4,
‘fifth’: 5
}
test_args(**kwargs)
# results:
# first argument: 1
# second argument: 2
# third argument: 3
# fourth argument: 4
# fifth argument: 5

使用*args和**kwargs可以非常方便的定义函数,同时可以加强扩展性,以便日后的代码维护。

示例

def foo(*args, **kwargs):
print(‘args = ‘, args)
print(‘kwargs = ‘, kwargs)
print(‘—————————————‘)
if __name__ == ‘__main__’:
foo(1,2,3,4)
foo(a=1,b=2,c=3)
foo(1,2,3,4, a=1,b=2,c=3)
foo(‘a’, 1, none, a=1, b=’2′, c=3)

注意

注:在定义或调用这种函数时,要遵循以下规则:可变参数一定在不可变参数之后*args是可变的positional arguments列表,**kwargs是可变的keyword arguments列表。并且,*args必须位于**kwargs之前,因为positional arguments必须位于keyword arguments之前

Posted in 未分类

发表评论