函数嵌套
嵌套:一个物体包含另一个物体
函数嵌套:一个函数包含另一个函数
函数嵌套分类
嵌套调用:在函数的执行过程中,去调用另一个函数,优点:可以简化外层大函数的代码,使结果更加清晰,可以将一个大的复杂的功能拆分成多个简单的小功能
嵌套定义:在函数的函数体中定义了另一个函数
注意:内部定义的函数只能在内部使用,外界无法调用
唯一的使用场景就是闭包函数,其他函数不要去写
名称空间:
namespace:存储名字的内存区域
特点:在运行过程中一直有效
生命周期:随着解释器的启动而生效,解释器运行结束而失效
全局名称空间:
定义:只要是靠最左边写的,没有任何缩进的代码,就在全局名称空间中
特点:在程序运行中一直有效
生命周期:随着py文件的执行而生效,随着py文件的执行结束而失效
注意:在if语句中,如果if是顶着最左边的没有缩进的,那么if里面的代码也属于全局
同样的,while、for、with也是如此
局部名称空间:
定义:存的是函数内定义的名字
特点:仅在函数调用时临时有效
生命周期:随着函数的调用结束而失效
名字的查找顺序:
先局部,后全局,再内置
名称空间的加载顺序:
先内置,后全局,再内置
作用域:
作用区域,作用范围,有效范围(换句话就是名字的有效范围)
存储名称的三个地方:
内置名称空间
全局名称空间
局部名称空间
由于内置名称空间的名字与全局名称空间的名字,可以在任意位置来访问,所以它们两个可以划到同一个范围,称之为全局范围即全局作用域
空间名称:空间的名字只能在当前的函数中访问,所以单独的划分到一个范围中,这个范围称之为局部作用范围及局部作用域
global(全局)与nonlocal(不使用本地)关键字
global当需要在函数内部修改全局中名字的值时需要使用global
注意:必须在使用这个名字之前声明global(全局)和nonlocal(不使用本地)
当需要在内存函数中修改外层函数中的名字,就需要使用nonlocal,会一层一层的往外找,直到找到为止,但是只能找函数中的,不能找全局的名字
函数是第一类对象:
1、能够被调用
2、可以当这容器类型的元素
3、可以当做函数的参数
4、可以当作函数的返回值
函数名除了可以调用之外,与一个变量名没有本质区别,变量名能怎么用,函数就能怎么用
闭包函数:
定义:一个和函数将另一个函数关闭在内部,闭包函数也是一种函数
特点:1、该函数是定义在另一个函数中的
2、该函数包含了对外层函数中名字的引用,无论在任何位置使用这个函数,其都包含了外部名字的引用
满足以上两点,就称为闭包函数
需要注意的是:名字所在的作用域,在函数定义阶段就已经固定了,与调用位置无关
现阶段,可以将闭包函数理解为另一种为函数体传值的方式