Python初学者第二十二天 函数进阶(1)
22day
1、函数命名空间:
2、函数作用域的查找顺序:LEGB
locals->enclosing function ->globals ->_builtins_
a、locals是函数内的名字空间,包括局部变量和形参
b、enclosing外部嵌套函数的名字空间
c、globals全局变量,函数定义所在模块的名字空间
d、builtins内置模块的名字空间
3、闭包
关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数)。而且,这些内部函数可以访问它们所在的外部函数中声明的所有的局部变量、形参。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。也就是说,内部函数会在外部函数返回后被执行。而当这个内部函数执行时,它仍然必需访问其外部函数的局部变量、参数以及其他内部函数。这些局部变量、参数和函数声明(最初时)的值是外部函数返回时的值,但也会受到内部函数的影响。
函数里面又套了一层子函数,外层函数执行的时候,子函数被返回。在外面执行子函数的时候,返回了外层函数的变量。这种关系就叫闭包
3.1 闭包的特点:
a.闭包只存在于函数中
b.闭包就是内层还是对外层还是(非全局变量)变量的引用
c.最内存函数名会被逐层返回给最外层
3.2 闭包验证
def func():
name = 'alex'
def inner():
print(name)
return inner
ret = func() # inner
ret()
print(func.__closure__) # 返回非cell
print(ret.__closure__) # 只要返回cell 他就是闭包
print(ret.__closure__[0].cell_contents) # 打印闭包调用的参数
a.函数名加'__closure__'方法。如果返回cell,证明这个函数是闭包。返回非cell,则不是闭包。
b.函数名‘_closure__[0].cell_contents’方法,可查看闭包所调用的参数
4. 闭包的作用:解释器遇到闭包,会触发一个机制,这个闭包不会随着他的结束而释放
def func(step): num = 1 def inner(): nonlocal num num += step print(num) return inner f = func(2) for i in range(5): f()
运行结果:
3
5
7
9
11