Use variable parameters with default parameters
Python supports variable parameters. The easiest way is to use default parameters, for example:
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
Use *args and **kwargs when defining the function
Of course, this article mainly Let’s talk about a way to achieve variable parameters (Variable Argument): use *args and **kwargs syntax. Among them, *args is a variable positional arguments list, and **kwargs is a variable keyword arguments list. Also, *args must come before **kwargs because positional arguments must come before keyword arguments.
First introduce the basic usage of the two.
The following example uses *args and contains a required parameter:
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
The following example uses *kwargs and contains a list of required parameters and *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
When calling a function, use *args and * *kwargs
*args and **kwargs syntax can be used not only in function definitions, but also when calling functions. The difference is that if using *args and **kwargs at the location where the function is defined is a process of packing parameters, then when the function is called, it is a process of unpacking parameters. Let’s use an example to deepen our understanding:
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
Using *args and **kwargs can be very convenient to define functions, and can also enhance scalability for future code maintenance.
Example
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)
Note
Note: When defining or calling this kind of function, follow the following rules:
Variable parameters must come after immutable parameters
*args is a variable positional arguments list, **kwargs is A variable list of keyword arguments. And, *args must be before **kwargs, because positional arguments must be before keyword arguments