Python中*args和**kwargs的用法总结
一、基本概念
Python支持可变参数,最简单的方法莫过于使用默认参数。
1 | def test_defargs(one, two=2): # 参数one没有默认值,two的默认值为2 |
另一种达到可变参数(Variable Argument)的方法:
使用*args
和**kwargs
语法。
*args
是可变的位置参数(postional arguments)列表;
**kwargs
是可变的关键词参数(keyword arguments)列表;
并且规定位置参数必须位于关键词参数之前,即*args
必须位于**kwargs
之前。
二、位置参数
以下是用位置参数正确调用函数的实例:
1 | def print_hello(name, sex): |
三、关键字参数
用于函数调用,通过“键-值”形式加以指定。
使用关键字参数可以让函数更加清晰,容易使用,同时也清除了参数的顺序需求。
以下是用关键字参数正确调用函数的实例:
1 | print_hello('Chen', sex=1) # 有位置参数时,位置参数必须在关键字参数的前面 |
以下是错误的调用方式:
1 | # print_hello(name='Chen', 1) # 有位置参数时,位置参数必须在关键字参数前面 |
四、可变参数
顾名思义,可变参数就是传入的参数个数是可变的,可以是任意个。*args
和**kwargs
两者都是Python中的可变参数。
1.可变位置参数*args
Python中规定参数前带*
的,称为可变位置参数,只是我们通常称这个可变位置参数为*args
而已,叫其他的也是一样的。
以数学题为例,给定一组数字a,b,c……,请计算a^2 + b^2 + c^2 + ……。
要定义这个函数,必须确定输入的参数。由于参数个数不确定,我们可以首先想到把a,b,c……作为一个list或者tuple传进来,这样函数就可以定义为:
1 | def calc(numbers): |
但是调用的时候,需要先组装出一个list或tuple:
1 | 1, 2, 3]) calc([ |
所以,为了方便起见我们把函数的参数改为可变位置函数:
1 | def calc(*numbers) # 可变位置参数 |
定义可变位置参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*
号。在函数内部,参数numbers
接收到的是一个tuple,因此函数代码完全不变。但是,调用该函数时,可以传入任意个参数,包括0个参数:
1 | >>>calc(1,2) |
如果已经有一个list或tuple,要调用一个可变位置参数怎么办?可以这么做:
1 | >>>nums = [1, 2, 3] |
这种做法当然是可行的,问题是太繁琐了,所以Python允许在list或tuple前面加一个*
,把list或tuple的元素变成可变位置参数传进去:
1 | >>>nums = [1, 2, 3] |
总而言之,*args
用来表示函数接收可变长度的非关键字参数列表作为函数的输入。我们可以通过以下这个例子进一步理解*args
:
1 | def test_args(normal_arg, *args): |
上面代码的执行结果如下:
1 | first normal arg: normal |
2.可变关键字参数**kwargs
同理,Python中规定参数前带
的,称为可变关键字参数,通常用kwargs表示。
**kwargs
表示函数接收可变长度的关键字参数字典作为函数的输入。当我们需要函数接收带关键字的参数作为输入的时候,应当使用**kwargs
。我们可以通过以下的例子进一步理解**kwargs
:
1 | def test_kwargs(**kwargs): |
以上代码的执行效果如下:
1 | name = python |
以上例子只是*args
和**kwargs
基本使用的例子。下面再给出一个用*args
和**kwargs
来定义能够接受列表输入和字典输入的函数的例子。
3.使用*args
和**kwargs
来调用函数
比如我们有如下接受普通输入参数的函数:
1 | def normal_func(arg1, arg2, arg3): |
使用*args
和**kwargs
来调用这个函数的代码如下:
1 | # 使用*args |
以上三段代码的输出均为:
1 | arg1: python |
引用文章: