定义
def 函数名():
函数体
注意:代码执行到定义函数的时候不会执行函数体,只是在内存中存储了函数名和默认参数等,只有调用的时候函数体才会执行
调用
函数名()
注意:函数调用的时候执行过程是:先到调用处,然后进入函数体执行,最后返回到调用处(因为携带了结果有可能需要赋值)
函数说明
定义
函数体第一行写一个字符串,用一对引号包裹,也可以多引号包裹
查看
help(函数名)
这里函数名后一般没有括号
参数
形参
定义函数的时候定义的参数
实参
调用函数的时候传递的参数
位置参数
形参和实参位置和个数一一对应
关键字参数/命名参数
- 调用函数传递实参的时候,指定形参赋值(使用形参名指定)
- fun1(‘XX’,age=18)
- 给非缺省参数命名传值,有一个的话必须全部参数命名传值,允许打乱顺序传值,不推荐使用
缺省参数
- 默认值 def fun1(a=1):
- 缺省参数必须在形参列表最后
-
缺省参数在代码执行到函数定义的时候同时被赋值,虽然不进入函数体,但是缺省参数已经被赋值了
def f(a, L=[]):
L被第一次赋值,并且赋值为可变参数类型,在后面操作如果不改变地址的话,内容是累积的
L.append(a) return L
print(f(1)) # 打印[1]
print(f(2)) # 打印[1,2]
print(f(3)) # 打印[1,2,3]通过这里更加证明了,函数定义部分是在代码运行到它那里就已经被执行了,而函数体是在调用的时候执行,而且在调用的时候是直接进入函数体的,并不去函数头。
不定长参数
一般参数
在定义形参的时候,在形参前面加*号,可以接受后面无确定赋值对象的不定长的所有值,并打包成元组
在调用的时候,实参列表或元组前面加*号,实现传值的时候拆包
字典参数
在定义的时候,在形参前面加**号,可以接受后面没有指定形参接受的命名参数
调用的时候,实参字典前面加**号,实现传值的时候拆包
注意点
必须写在形参列表的最后,字典参数必须出现在一般参数后面
返回值
return返回结果给函数调用者,函数调用者接收到返回值时可以使用变量接收
return会截断函数体执行,直接返回
不带return的函数自动返回None
返回多个值
- 通用办法:装箱,根据实际需求装箱返回
- 值少的推荐方法:多元素直接跟在return后面,默认返回的是一个元组
四种函数类型
- 无参无返回值
- 无参又返回值
- 有参无返回值
- 有参有返回值
局部变量
函数内定义的变量,只能在函数体内部存在使用
全局变量
在函数外定义,在整个程序都能使用
global:在函数内声明变量为全局变量
引用
变量是通过内存起始地址来查找数据的
可变数据类型
列表,字典
当修改数据的时候,直接在源数据上面修改
不可变数据类型
数字,布尔值,字符串,元组
当象征性的修改数据时,会重新创建一个新的数据块,然后把新的地址赋值
函数中传递的时候,修改形参不影响实参指代的数据
匿名函数
创建一个小型的一次使用的函数
lambda [arg1[,arg2[,….argn]]:expression
sum = lambda x,y:x+y
sum(11,12)
传递
函数可以作为参数传递,尤其是匿名函数