视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
理解Python中s可变参数的*args和**kwargs
2020-11-27 14:27:46 责编:小采
文档


使用默认参数的可变参数

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之前

下载本文
显示全文
专题