闭包的理解
** 闭包**:就是一个概念,出现在嵌套函数中,指的是内层函数引用到了外层函数的**自由变量**(未在本地作用域中定义的局部变量),就形成了闭包。
函数的局部作用域是不能够保存信息的,即在函数内部声明变量在函数调用结束之后函数里面保存的信息就被销毁了,包括函数的参数。而这时使用闭包的话就能发挥作用:
**保存函数的状态信息,使函数的局部变量信息依然可以保存下来**。形成闭包之后,闭包变量能够随着闭包函数的调用而实时更新,就好像是一个全局变量那样。
我们可以将闭包理解为一种特殊的函数,这种函数由两个函数的嵌套组成,且称之为外函数和内函数,外函数返回值是内函数的引用,此时就构成了闭包。
“闭包”的本质就是函数的嵌套定义,即在函数内部再定义函数。
闭包”的最大的作用——保存局部信息不被销毁。
我们发现每次再运行该函数,里面的count变量其实已然保存。如果你希望函数的每次执行结果,都是基于这个函数上次的运行结果。
通过以上简单的代码就很明了了闭包的好处之一。
另一个好处:闭包可以根据外部作用域的局部变量来得到不同的结果,这有点像一种类似配置功能的作用,我们可以修改外部的变量,闭包根据这个变量展现出不同的功能。这点在装饰器中得到大量运用。
**多层装饰器**的运行套用都是从下套上,一层套一层,具体看一下代码就明晓。
#coding=utf-8 def a(fn): print 'a' def a1(*args): print 'a1' return fn(*args) return a1 def b(fn): print 'b' def a1(*args): print 'a2' return fn(*args) return a1 @a #1 @b #2 def test(): #3 print 'test' # test = b(test) #相当于1,2,3的模式 # test = a(test) #上面相当于 test = a(b(test)) test() ---------执行结果----------- b a a1 a2 test
两层装饰器能很好的完成注册,方便构成架子写进不同函数:
闭包的用途
Python中,闭包的主要用途就是用于装饰器的实现,以后博客中将会对装饰器做详细解释↖(^_^)↗
以上便是本人对闭包的理解,希望能够对初学者有所帮助,欢迎小伙伴们批评指正 ~
https://blog.51cto.com/13929187/2169162
Python中关键字global与nonlocal的区别
第一,两者的功能不同。global关键字修饰变量后标识该变量是全局变量,对该变量进行修改就是修改全局变量,而nonlocal关键字修饰变量后标识该变量是上一级函数中的局部变量,如果上一级函数中不存在该局部变量,nonlocal位置会发生错误(最上层的函数使用nonlocal修饰变量必定会报错)。
第二,两者使用的范围不同。global关键字可以用在任何地方,包括最上层函数中和嵌套函数中,即使之前未定义该变量,global修饰后也可以直接使用,而nonlocal关键字只能用于嵌套函数中,并且外层函数中定义了相应的局部变量,否则会发生错误(见第一)。