定义
函数的嵌套:嵌套调用
嵌套定义:定义在内部的函数无法直接在全局被调用
函数名的本质:就是一个变量,保存了函数所在的内存地址
闭包:内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数
Python代码运行遇到函数时的运行流程:
从python解释器开始执行之后,就在内存中开辟了一个空间
每当遇到一个变量的时候,就把变量名和值之间的对应关系记录下来。
但是当遇到函数定义的时候解释器只是象征性的将函数名读入内存,表示知道这个函数的存在了,至于函数内部的变量和逻辑解释器根本不关心。
等执行到函数调用的时候,python解释器会再开辟一块内存来存储这个函数里的内容,这个时候,才关注函数里面有哪些变量,而函数中的变量会存储在新开辟出来的内存中。函数中的变量只能在函数的内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。
我们给这个“存放名字与值的关系”的空间起了一个名字——叫做命名空间
代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间,在函数的运行中开辟的临时的空间叫做局部命名空间
理解嵌套函数
举例:
def f1():
def f2():
def f3():
print("in f3")
print("in f2")
f3()
print("in f1")
f2()
f1()
打印结果:
in f1
in f2
in f3
理解作用域
举例1:
def f1():
a = 1
def f2():
a = 2
f2()
print('a in f1 : ',a)
f1()
打印结果:
a in f1 : 1
举例2:
def f1():
a = 1
def f2():
nonlocal a
a = 2
f2()
print('a in f1 : ',a)
f1()
打印结果:
a in f1 : 2
对比例子1和2理解nonlocal
1.外部必须有这个变量
2.在内部函数声明nonlocal变量之前不能再出现同名变量
3.内部修改这个变量如果想在外部有这个变量的第一层函数中生效
闭包
内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数
def func():
name = 'Jose'
def inner():
print(name)
闭包+嵌套
举例:
def wrapper():
money = 999
def func():
name = 'Jose'
def inner():
print(name,money)
return inner
return func
f = wrapper()
i = f()
i()
打印结果:
Jose 999