一、形参和实参,位置参数和关键字参数,默认形参、可变长度参数
1、形参和实参
形参:定义阶段的参数
实参:调用阶段的参数
2、位置参数和关键字参数
位置参数:按照从左到右依次定义的参数(形参和实参都可以),位置形参必须传值
关键字参数(关键字实参):以不按照顺序,按key=value的形式传入实参的方式,其中key一定是与定义函数的形参名或变量名是一样的。
混用时位置实参必须放在关键字实参之前。
3、默认参数(默认形参)
再函数定义阶段,就为其赋了默认值的形参。
默认参数的值是在函数定义阶段被赋值的。
虽然函数默认参数的值可以指定成任意数据类型,但是不建议指定成可变类型。对于确实需要定义成可变类型,可以将参数赋值为None。
默认参数必须在位置参数的后边。
4、可变长度的参数:在调用函数的时候,传入的实参个数是不固定的
多出来的位置实参:
用法:*形参名 比如:*args
多出来的位置实参会被*处理成元组。
多出来的关键字实参:
用法:**形参名 比如:**kwargs
多出来的关键字实参会被**处理成字典格式。
*和**都是用来接收溢出来的实参的,必须要放在最后,就是要在位置形参和默认形参之后。
也可以利用* 传递实参值,比如:
def func(x,y,z):
print(x,y,z)
func(*[1,2,3])
#*在此处就可以将列表里面的值给打散,打散成位置实参
只要可以for循环的值,都可以被* 打散,比如:列表、字符串、字典(字典打散就只剩下key了)
也可以利用* *传递实参值,此时**后边的变量必须是字典,并且字典key的个数和名称要一致。
5、可变长参数混用
**kwargs必须放在*args之后,主要是考虑函数以后的可扩展性
def func(x,y=2,*args,88kwargs):
print(args)
print(kwargs)
#其中x、y参数也可以没有,此时传入的所有值都是多出来的,一次函数调用时可以不用传值。
重点的应用形式:
def func(x,y,z):
print('func1>>>',x,y,z)
形式1:
def func2(x,y,z):
func1(x,y,z)
形式2:
def func2(*args,**kwargs):
#上面的*将位置参数打包成元组,**将关键字参数打包成字典
func1(*args,**kwargs)
#此处的*又将上面的元组打散成位置参数,**将上面的字典打散成关键字参数
func2(1,2,3)
###############
如果使用形式1的方式,当函数func1修改后,函数func2也必须对应的修改,否则func2函数就无法使用了。但是使用形式2的方式后,即使函数func1修改了,func2也不需要修改,只需要根据func1的形参传入参数即可。



