1. 函数的定义
对代码块和功能进行封装和定义的就叫函数.
2. 函数语法
def 函数名(形参):
函数体
函数名(实参)
函数名的命名规则: 命名规则与变量一致.
3. 函数的返回值
return,函数执行完毕,不会执行后面逻辑
1. 如果函数中不写return,返回None
2. 只写return, 返回None
3.return返回值, 返回一个值
4. return 值1,值2,... 返回多个值. 调用方接收到的是tuple元组
4. 函数的参数
在函数执行的时候给函数传递的信息
1. 形参:
1. 位置参数
2. 默认值参数,当调用的时候不给传值使用默认值
3. 混合使用. 顺序: 位置参数 > 默认值参数
2. 实参:
1. 位置参数, 按照位置给形参赋值
2. 关键字参数, 按照名称给形参赋值
3. 混合参数, 顺序: 位置参数 > 关键字参数
3. 动态参数
位置参数的动态参数: *args
可以传入任意的位置参数, 接受到的是tuple类型的数据
关键字参数的动态参数: **kwargs
动态接受关键字参数, 接收到的是dict类型的数据
使用顺序: 位置,*args > 默认值参数 > **kwargs
*表示聚合,所有的位置参数,聚合成元组. **聚合成字典
在实参位置上给⼀一个序列,列表,可迭代对象前面加个*表示把这个序列按顺序打散.
在形参的位置上的* 表示把接收到的参数组合成⼀一个元组 如果是⼀一个字典, 那么也可以打散. 不过需要用两个*
def fun(**kwargs): print(kwargs) dic = {'a':1, 'b':2} fun(**dic)
5. 函数的命名空间和作用域:
命名空间:
在python解释器开始执⾏行行之后, 就会在内存中开辟⼀一个空间, 每当遇到⼀一个变量量的时候, 就 把变量量名和值之间的关系记录下来, 但是当遇到函数定义的时候, 解释器只是把函数名读入内 存, 表⽰示这个函数存在了了, ⾄至于函数内部的变量量和逻辑, 解释器是不关⼼心的. 也就是说⼀一开始 的时候函数只是加载进来, 仅此⽽而已, 只有当函数被调⽤用和访问的时候, 解释器才会根据函数 内部声明的变量量来进⾏行行开辟变量量的内部空间. 随着函数执⾏行行完毕, 这些函数内部变量量占⽤用的空 间也会随着函数执⾏行行完毕⽽而被清空.
1. 内置命名空间: python解释器内部运行时的变量函数
2. 全局命名空间: 我们在py文件中直接声明出来的变量.函数
3. 局部命名空间: 在函数内部声明的变量和函数
作用域:
1. 全局作用域: 内置命名空间和全局命名空间
2.局部作用域: 局部命名空间
globals()方法: 查看全局作用域中名字
locals()方法: 查看当前作用域中的名字
a = 10 def func(): a = 20 print(a) # 就近原则 print(globals()) # globals() 获取到全局作用域(内置,全局)中的所有名字 print(locals()) # locals() 查看当前作用域中的所有名字 func()
6. 函数的global和nonlocal:
global: 不再使用局部作用域中的内容了, 而改用全局作用域中的变量
def func(): global a # a 不再是局部变量. 是全局变量 a = 30 # 把全局中的a重新赋值成30 print(a) func() print(a)
nonlocal: 在局部作用域中,调用离它最近的一层父级空间中的变量, 不会找全局
a = 10 def func1(): def func2(): nonlocal a # 找局部作用域中 离他最近的那个变量引入进来 a = 20 print(a) func2() print(a) func1()
7. 函数的嵌套
a = 1 def func_1(): a=2 def fun_2(): def fun_3(): nonlocal a a=4 print(a) print(a) fun_3() print(a) print(a) fun_2() print(a) print(a) func_1() print(a)
>>>函数打印结果: 1 2 2 4 4 4 1
8. 函数的注释
def chi(food, drink): """ 这里是函数的注释 , 先写一下当前这个函数是干什么的 , 比如我这个函数就是一个吃 :param :param food: 参数 food 是什么意思 :param :param drink: 参数 drink 是什么意思 :return :return: 返回的是什么东东 """ print(food, drink) return "very good