Python中*args 和**kwargs(可变长参数)
Admin
2019-04-29 11:05:04
Python
当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值。
def func(argc, *args): print "argc:", argc for x in args: print "args:", x func(1, "two", 3) # *args可以当作可容纳多个变量组成的list # argc: 1 # args: two # args: 3
def func(argc, **kwargs): print "argc:", argc for x in kwargs: print "kwargs: %s: %s" % (x, kwargs[x]) func(argc=1, argc2="two", argc3=3) # argc2和argc3被视为key,**kwargs可以当作多个key和value的dict # argc: 1 # kwargs: argc2: two # kwargs: argc3: 3
另外一种可以达到可变参数 (Variable Argument) 的方法:
使用*args和**kwargs语法。其中,*args是可变的positional arguments列表,**kwargs是可变的keyword arguments列表。
*args必须位于**kwargs之前,因为positional arguments必须位于keyword arguments之前。
def func(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) func(1, 2, 3, 4, k1=5, k2=6) # 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是一个将参数pack的过程,那么在函数调用的时候就是一个将参数unpack的过程了。
def func(one, two, three, four, five): print 'one args: ', one print 'two args: ', two print 'three args: ', three print 'four args: ', four print 'five args: ', five args = [1, 2, 3, 4, 5] func(*args) # one args: 1 # two args: 2 # three args: 3 # four args: 4 # five args: 5 kwargs = { 'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5 } func(**kwargs) # one args: 1 # two args: 2 # three args: 3 # four args: 4 # five args: 5
使用*args和**kwargs可以非常方便的定义函数,同时可以加强扩展性,以便日后的代码维护。