函数命名空间,作用域,嵌套,闭包
复习:
函数的优点:可读性强,复用性强
函数如何定义:
def 函数名(): # 函数体 # return 返回值
所有的函数 只定义不调用就一定不执行,函数需要先定义,后调用
调用函数:
函数名() # 不接收返回值
返回值 = 函数名() # 接收返回值
return返回值有几种情况:
- 没有返回值:默认返回None
- 不写return : 函数内的代码执行完毕自动结束
- 只写return : 结束一个函数
- return None
- 返回一个值: 结束了函数且返回一个值
- 返回多个值:
- 多个值之间用逗号隔开,接收的时候可以用一个变量接收,这个变量print的时候,就是一个元祖
- 多个值之间用逗号隔开,也可以用多个变量接收,每个变量的值为对应的值的结果
参数:
- 形参: 定义参数的时候
- 位置参数: 必须传
- *args : 动态参数,可以接收多个按位置传入的参数
- 默认参数: 可以不传----因为在对应的位置的参数有了默认的值了
- **kwargs: 动态参数 可以接收多个关键字传入的参数
- 实参: 调用函数的时候
- 按照位置传参数
- 按照关键字传参数
- 可以混合用,位置参数必须在关键字参数前面
- 不能对一个参数重复赋值
新内容
函数的命名空间
有三种:
内置命名空间:python解释器一启动,加载到内存里的变量所在的范围,可以直接调用
全局命名空间: 在函数外部的空间
局部命名空间:在函数内部的空间
函数的作用域:
全局作用域:内置和全局命名空间的变量都属于全局作用域,作用在全局
局部作用域:函数内部的变量属于局部作用域,作用在局部
变量:
全局变量:在函数外部定义的变量,作用范围:整个程序
局部变量:在函数内部定义的变量,作用范围:所在的函数
global ,nolocal , globals,locals,
global : 在函数内部想要修改全局变量的时候,使用global
nolocal: 在嵌套函数中调用上一层函数的变量
globals: 查看全局和内置空间的变量
locals: 查看当前所在空间范围的变量
嵌套函数
# 函数嵌套的定义 # 内部函数可以使用外部函数的变量 a = 1 def outer(): a = 1 def inner(): a = 2 def inner2(): nonlocal a # 声明了一个上面第一层的局部变量 a += 1 inner2() print('##a##',a ) inner() print('##2##' , a ) outer() print('全局a',a)
高阶函数:
需要满足的条件:满足任意一个就行
接收一个或多个函数作为输入
return 返回另一个函数
递归函数
定义:在函数内部,可以调用其他函数,如果一个函数在内部调用自己本身,
特性:
必须有一个明确的条件
每次进入更深一层递归时,问题规模相比上次递归都应有所减少
递归效率不高,递归层次过多会导致栈溢出