day12 函数嵌套 名称空间 作用域 闭包函数
01函数嵌套
函数嵌套指的是一个函数包含另一个函数
按照 函数的两个阶段 分为
嵌套调用:
指的是在函数的执行过程中调用了另一个函数
其好处是可以简化0函数的代码,使得结构更清晰
可以将大的复杂的功能拆分为多个简单的小功能
def func1():
print('func1 run!')
def func2():
func1()
print('func2 run')
func2()
嵌套定义(唯一使用场景就是闭包函数,除此之外不要这么写):
指的是在函数的函数体中定义了另一个函数
def outer():
print("outer run")
def inner():
print("inner run")
inner()
outer()
需要注意的是 内部定义的函数 只能在内部使用,外界无法直接访问
02名称空间:就是存储名字的内存区域
名称空间的分类:
1.内置名称空间:存的是解释器自带的名称,列如print len
特点:是在程序运行的过程中都有效
生命周期:随着解释器的启动而生效 随着解释器运行结束而失效
2.全局名称空间:只要是顶着最左边写的,没有任何缩进的,就在全局名称空间中
特点:是在程序运行的过程中都有效
生命周期:随着py文件的执行而生效,随着py文件执行结束而失效
需要注意的是:在if while for with中 如果if是顶着最左边的没有缩进的 if里面的名字也属于全局
3.局部名称空间:
存的是函数内部定义的名字
特点:仅在函数调用临时时有效
生命周期:随着函数的调用而生效,随着函数的调用结束而失效
名称空间的加载顺序
内置-->全局-->局部
名字的查找顺序
局部-->全局-->内置
03作用域:简单的说就是名字的有效范围
存储名称的有三个地方
1.内置名称空间
2.全局名称空间
3.局部名称空间
全局作用域:
由于内置名称空间的名字与全局名称空间的名字,可以在任何位置来访问,所以他们两可以划到同一个范围,称之为全局范围,全局作用域
局部作用域:
局部名称的名字只能在当前的函数中访问,所以他单独划到一个范围,这个范围称之为局部作用域
04global(全局)0域nonlocal(不使用本地)关键字
global当需要函数内部修改全局中名字的值时,需要用global
注意,必须在使用这个名字之前声明global
nonlocal(不适用本地)
当需要在内层函数中修改外层函数中的名字时就需要使用nonlocal
会一层一层往外找 直到找到了为止,但是只能找函数中的 不能找到全局的名字
05函数对象
目的是为了让你了解函数都可以做什么来使用
函数是第一类对象:
1.能够被调用
2.可以当做容器类型的元素
3.可以当做函数的参数
4.可以当做函数的返回值
函数名除了可以调用之外与一个变量名没有本质区别 变量能怎么用 函数名就能怎么用
06闭包函数
闭包:一个函数将另一个函数关闭在内部,反过来说一个函数被另一个函数包裹
闭包函数也是一种函数:
其特点是:
1.该函数是定义在另一个函数中的
2.该函数包含了对外层函数中名字的引用,无论在任何位置使用这个函数,其都包含了外部名字引用
满足以上两条称之为闭包函数
需要注意的是名字所在的作用域 在函数定义阶段就已经固定了 与调用阶段无关
现阶段可以将闭包理解为另一个为函数体
传值的方式
之前只能通过参数给函数传值
由于名称空间与作用域的特点,内层定义的函数只能在内层使用
而函数对象可以将一个函数作为返回值,使得内部函数可以被外界使用