1.定义函数:
函数的定义就相当于事先将函数体代码保存起来,然后将内存地址赋值给函数名,函数名就是对这段代码的引用,这和变量的定义是相似的。没有事先定义函数而直接调用,就相当于引用一个不存在的“变量名”
def 函数名(参数1,参数2,...):
"""
文档描述
"""
函数体
return 值
定义函数发生的事情:
1.申请内存空间保存函数体代码
2.将上述内存地址绑定给函数名
3.定义函数不会执行函数体代码,但是会检测函数体语法
调用函数发生的事情:
1.通过函数名找到函数的内存地址
2.然后加括号就是在触发函数体代码的执行
2.函数返回值
返回值特征:
返回值的数据类型:是所有的数据类型,包括连函数自己本身的代码都可以返回
返回值不是只有一个结果:可以返回多个结果,要用逗号隔开,如果用一个变量接收,那么以元组的形式返回
3.函数参数
形参与实参介绍:
形参:在定义函数阶段定义的参数称之为形式参数,简称形参,相当于变量名
def func(x, y):
print(x, y)
实参:在调用函数阶段传入的值称之为实际参数,简称实参,相当于变量值
func(1, 2)
形参与实参的关系:
1.在调用阶段,实参(变量值)会绑定给形参(变量名)
2.这种绑定关系只能在函数体内使用
3.实参与形参的绑定关系在函数调用时生效,函数调用结束后解除绑定关系
位置参数
位置参数:按照从左到右的顺序依次定义的参数称之为位置参数
位置形参:在函数定义阶段,按照从左到右的顺序直接定义的“变量名”
特点:必须被传值,多一个不行,少一个也不行
def func(x, y, z):
print(x, y, z)
位置实参:在函数调用阶段,按照从左到右的顺序依次传入的值
特点:按照顺序与形参一一对应
func(1, 2, 3)
func(3, 2, 1)
关键字参数
关键字实参:在函数调用阶段,按照key=value的形式传入的值
特点:指名道姓给某个形参传值,可以完全不参照顺序
def func(x, y):
print(x, y)
func(x=1, y=2)
func(y=1, x=2)
混合使用
1.位置实参必须放在关键字实参前
func(1, y=2)
2.不能为同一个形参重复传值
func(1, y=2, x=3) 错误
默认参数
默认形参:在定义函数阶段,就已经被赋值的形参,称之为默认参数
特点:在定义阶段就已经被赋值,意味着在调用阶段可以不为其赋值
def func(x, y=3):
print(x, y)
func(1)
func(1, 4)
位置形参与默认形参的混合使用
1.位置形参必须在默认形参的左边
def func(x, y=1):
print(x, y)
func(1, 2) #实参传入2,那么输出的y=2
2.默认参数的值是在函数定义阶段被赋值的,准确的说被赋予的是值的内存地址
m=2
def func(x, y=m):#2的内存地址送给y
print(x, y)
m = 3
func(1)#输出结果是 1,2
m = [1]
def func(x, y = m):#将[1]的内存地址给y
print(x, y)
m.append(2)
func(1)# 输出结果为:1,[1,2]
3.虽然默认值可以被指定为任意数据类型,但是不推荐使用可变类型
函数最理想的状态:函数的调用只跟函数本身有关系,不受外界代码的影响