# 可变长参数
## 为什么会有可变长参数这个概念?
```python# -*- coding: utf-8 -*-'''@File : 8-可变长参数.py@Author : HY @Version : 1.0@Desc : None'''def func1(x,y,z): passdef func2(x,y,z): func1(x,y,z)func2(1,2,3)"""如果位置参数不止xyz三个参数,而是跟随需求不断变化的位置参数这样func1变动那随之变动的就是func2,使用函数的目的就是可以复用因此针对这一情况就有了可变长参数这个概念"""'''@OutPut : '''```
## 那什么是可变长参数?
在调用函数的时候传入的实参个数不是固定的,在创建函数的时候形参的数量是不固定的
### 可变长度位置参数
用法就是
```python'''*形参名称'''# -*- coding: utf-8 -*-'''@File : 8-可变长参数.py@Author : HY @Version : 1.0@Desc : 现在在func1中位置参数可以随便加,只要是是在func1调用的时候传入相对应的参数值即可'''def func1(x,y,*args): print(x,y,args)func1(1,2,3)'''@OutPut : 1 2 (3,)'''```
其中的形参名称理论上是可以随便命名的但是一般编程的时候默认形参名称为args,在形参前面还有一个*,这个星号的意义是打包多余传入的参数并将其处理为元组形式,args这个形参名称绑定这个元组的内存地址
### 可变长度关键字参数
用法就是
```python'''**形参名称'''# -*- coding: utf-8 -*-'''@File : 8-可变长参数.py@Author : HY @Version : 1.0@Desc : None'''def func1(x,y,**kwargs): print(x,y,kwargs)func1(x=1,y=2,z=3)'''@OutPut : 1 2 {'z': 3}'''```
其中的形参名称理论上是可以随便命名的但是一般编程的时候默认形参名称为kwargs,在形参前面还有一个**,这个两个星号的意义是打包多余传入的参数并将其处理为字典形式,kwargs这个形参名称绑定这个字典的内存地址
**需要注意的是无论是args还是kwargs都必须放置在所有参数之后,因为这两个参数都是来承接多余的溢出参数的**
## 在形参中* 号的作用是将溢出的参数进行打包,那在实参中呢?
在实参中单个星号的作用是将列表、元组打散,将字典类型进行打散(值得注意的是将字典类型打散之后会只剩下key)
两个星号的作用是将字典打散成关键字实参(关键字实参中的key必须要和函数的形参名称一致)
```python# -*- coding: utf-8 -*-'''@File : 8-可变长参数.py@Author : HY @Version : 1.0@Desc : None'''def func(x,y,z): print(x,y,z)m=(1,2,3)func(*m)l=[8,5,2]func(*l)'''@OutPut : 1 2 38 5 2'''# -*- coding: utf-8 -*-'''@File : 8-可变长参数.py@Author : HY @Version : 1.0@Desc : None'''def func(x,y,z): print(x,y,z)d={"x":1,"y":2,"z":3}func(**d)'''@OutPut : 1 2 3'''```
## 混用
当一个星号和两个星号混用的时候两个星号必须放置在一个星号之后(这是语法规定)
```python# -*- coding: utf-8 -*-'''@File : 8-可变长参数.py@Author : HY @Version : 1.0@Desc : None'''def func(x,y,*args,**kwargs): print(x,y,args,kwargs)d={"c":1,"q":2,"e":3,"m":56}func(1,2,3,**d)"""分析这个函数的运行过程对于函数中参数的逻辑应该充分理清1.调用函数func,将12传给xy2.3传给args通过可变长度位置形参中的*被打包成元组3.d这个字典首先在实参这里被打散成关键字实参4.关键字实参传递至函数中,又被**kwargs打包成字典格式"""'''@OutPut : 1 2 (3,) {'c': 1, 'q': 2, 'e': 3, 'm': 56'''```
可以尝试分析一下这个参数的传递过程
```python# -*- coding: utf-8 -*-'''@File : 8-可变长参数.py@Author : HY @Version : 1.0@Desc : None'''def func(x,y,*args,**kwargs): print(x,y,args,kwargs)d={"x":1,"y":2,"e":3,"m":56}func(**d)'''@OutPut : 1 2 () {'e': 3, 'm': 56}'''```