函数参数
形参:指的是定义函数阶段括号内指定的变量名,即形参的本质就是变量名
实参:指的是调用函数阶段括号内传入的值,即实参的本质就是值
形参与实参的关系:在调用函数时,会将实参(值)赋值(绑定)给形参(变量名)
这种绑定关系在函数调用时临时生效,在调用结束后失效
位置参数
位置形参:在定义函数阶段从左到右的顺序依次定义的形参,称之为位置形参
注意:但凡按照位置定义的形参,必须被传值,多一个不行,少一个也不行
位置实参:在调用阶段按照从左往右的顺序依次传入的值,称之为位置实参
注意:但凡按照位置定义的实参,会与形参一一对应
关键字参数
关键字实参:在调用函数阶段,按照key=value的形式指名道姓的为形参传值
注意:可以完全打乱顺序,但任要指名道姓的为指定的形参传值
可以混合位置实参与关键字使用,但是必须注意位置实参必须反倒关键字实参的前面,不能对一个形参重复赋值
默认参数
默认参数:指定的是定义函数阶段,就已经为某个形参赋值了,该形参称之为又默认值的形参,简称默认形参
注意:在定义阶段就已经被赋值,意味着在调用阶段可以不用为其赋值
位置形参应该放在默认形参的前面
默认参数的值在函数定义阶段就已经固定死了,通常情况应该是不可变类型
位置形参VS默认形参
对于大多数情况下传的值都不同,定义位置形参
对于大多数情况下传的值相同,定义默认形参
可变长参数
参数长度可变指的是调用函数时,传入的实参值个数不固定,而实参的定义方式有两种:位置实参和关键字实参,对应的形参必须有两种解决方案*和**,分别对应溢出的位置实参和关键字实参
在形参中带*:会将调用函数时溢出的位置实参保存成元组然后赋值给*后的变量名
在实参中带*:但凡在实参中带*的,在传值前都会将其打散成位置实参,再进行赋值
在形参中带**:会将调用函数时溢出的关键字实参保存成字典,然后赋值给**后的变量名
在实参中带**:但凡在实参中带**的,在传值前都会将其打散成关键字实参,再进行赋值
规范:在形参中带*的后面的变量名应该为args,**后面的变量名应该是kwargs
当我们想要给一个函数的参数格式原封不动的转嫁给其内部的一个函数,应该使用一下方式:
def bar(x,y,z):
print(x,y,z)
def wrapper(*args,**kwargs):
bar(*args,**kwargs)
wrapper(1,2,z=3) #虽然调用的是wrapper,但是要遵循的却是bar的参数标准