## 可变长参数
默认情况下,必须使用正确数量的参数调用函数,这意味着,如果您的函数需要2个参数,则必须使用2个参数(不多也不少)来调用函数。
示例,该函数需要2个参数,并获得2个参数:
```
def my_function(fname, lname):
print(fname + " " + lname)
my_function("Emil", "Refsnes")
```
如果尝试使用1或3个参数调用该函数,则会收到错误消息:
```
def my_function(fname, lname):
print(fname + " " + lname)
my_function("Emil")
```
可变长参数就是向一个函数传入不定个数的参数。有时候,你预先不知道函数需要接受多少个实参,好在python函数可以定义可变参数。顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。
python能够分别接收两种“可变长参数”的函数:
* 非关键字参数`*args`,数据结构为:tuple元组(注:元组不能被修改);
* 关键字参数`**kwargs`,数据结构为:dict字典。
## 非关键字参数
非关键字参数接收的是一个tuple元组,在Python文档中,*任意参数*通常缩写为`*args`。
如果您不知道将传递给您的函数多少个参数,请在函数定义的参数名称之前添加一个`*`,这样,函数将接收一个参数*元组*,并可以相应地访问各项。
1、下面的函数只有一个形参`*args`,但不管调用语句提供了多少实参,这个形参都将它们统统收入囊中,
```
def func(*args):
print(args)
func(10, 20, 30, 40, 50)
```
示例输出结果
```
(10,20, 30, 40, 50)
```
2、如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。 Python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。
```
def func(a, *args):
print(a)
print(args)
func(10, 20, 30, 40, 50)
```
示例输出结果
```
10
(20, 30, 40, 50)
```
基于上述函数定义, Python将收到的第一个值存储在形参`a`中,并将其他的所有值都存储在元组`args`中。
3、形参名`*args`中的星号让Python创建一个名为args的空元组,并将收到的所有值都封装到这个元组中,即便函数只收到一个值也如此。
```
def func(*args):
print(args)
func(10)
```
示例输出结果
```
(10,)
```
## 关键字参数
如果您不知道将传递给函数多少个关键字参数以及传递给函数的会是什么样的信息,请在函数定义中的参数名称前添加两个星号`**`。将函数编写成能够接受任意数量的键值对。这样,函数将接收参数*字典*,并可以相应地访问各项。
示例
```
def func(**kwargs):
print(kwargs)
func(x=1,y=2,z=3)
```
示例输出结果
```
{'x': 1, 'y': 2, 'z': 3}
```
在Python文档中,*任意Kword参数*通常缩短为`** kwargs`。