函数的使用原则:
函数的使用应该分为两个明确的阶段:1、定义阶段,只检测语法,不执行代码。
2、调用阶段,会触发函数体代码的执行。
函数的定义三种形式:
有参函数:需要外部传接的值。定义时有参,就必须传参,否则报错。
无参函数:不需要外部传接的值。定义时无参,就不能传参,否则报错。
空函数:赋值时,用pass来站位。一般用于刚开始开发程序,构建框架。
函数的返回值(return):
函数的返回值没有类型限制,函数的返回值没有个数限制。
返回多个值时,多个返回值用逗号分隔开,返回的是元组形式。
返回单个值时,返回的就是该值本身。
返回零个值或没有返回值时,得到的结果为None
return除了有返回值的功能,还有结束函数执行的功能。
函数内可以有多个return,但只要执行一次,整个函数就立即结束,并且将return后的值返回。
函数的参数分为两大类:
形式参数(形参):在定义函数阶段,括号内定义的参数/变量名成为形参。
实际参数(实参):在定义函数阶段,括号内转入的值/变量值成为实参。
在调用函数阶段会将实参(值)的值绑定给形参(变量名),这种绑定关系只在调用函数时生效,在函数执行完毕后就会解除绑定。
函数的参数的细分:
位置参数:
位置形参:在定义阶段,按照从左到右的顺序依次定义的形参称之为位置形参。
特点:但凡按照位置定义的形参,必须被传值,多一个不行少一个也不行,都会报错。
位置实参:在调用阶段,按照从左到右的顺序依次传入的值称之为位置实参。
特点:与形参一一对应。
关键字实参:
在调用阶段,按照key=value的形式定义的实参称之为关键字实参。
特点:完全可以打乱顺序,但仍然能为指定的形参传值。
实参的形式可以是位置形参和关键字形参混用,但必须遵守原则。
关键字实参必须放在位置实参的后面;不能对同一个形参重复传值。
默认形参:
在定义阶段,就已经为形参赋值,该形参称之为默认形参。
特点:定义阶段就已经有值,意味着调用阶段不需再传值。
默认形参必须放在位置形参的后面。
默认形参的值在函数定义阶段就已经固定死了,定义阶段之后的改动不会影响该值。
默认形参的值通常是不可变类型。
可变长参数:
可变长实参:指在调用阶段,实参值个数是不固定的。
实参无非两种形式(位置,关键字实参),对应着形参也必须有两种解决方案来分别接收溢出位置实参或者关键字实参。
溢出的位置实参,在实参前加*;溢出的关键字实参,在实参前加**。
*的用法:
在形参前加*,*会将溢出的位置实参存成为元组的形式,然后赋值给*后的变量名。
在实参前加*,但凡碰到实参中带*的,先将实参打散成位置实参,再与形参做对应。
**的用法:
在形参前加**,**会将溢出的关键字实参存为字典的形式,然后赋值给**后的变量名。
在实参前加**,但凡碰到实参中带**的,先将实参打散成关键字实参,再与形参做对应。
(形参中,*和**建议和args和kwargs连用,即*args,**kwargs)
*与**的应用:
def index(name,age,sex):
print(‘index==>’,name,age,sex)
会将wrapper函数接受的参数格式原封不动的转嫁给其内部的index函数,必须要遵从的是index的参数规则
def wrapper(*args,**kwargs):
index(*args,**kwargs)