闭包是一个颇有意思的东西,理解起来很绕,可是理解后很简单,网上的讲解也朦朦胧胧的.根据本身的理解解释一番:python
预备知识:函数中的做用域闭包
python中函数的做用域由def关键字界定,函数内的代码访问变量的方式是从其所在层级由内向外的. 即函数内使用某变量a,可是该变量在函数内部没有定义,那么会去函数外面寻找是否认义该变量a,若没有继续往外寻找. 函数外面定义的变量,函数内部能够读取使用,可是不能更改,会报错. a = 1 def res(): a = a + 1 #报错,a是外面的全局变量,函数内部不能改变 print(a) res() 可是能够返回函数内部的局部变量到外面,更改全局变量! a = 1 def res(): return a+1 a = res() print(a) #输出2,没有在函数内部改变全局变量a,而是在函数外面改变全局变量a
闭包目的:函数
有一个函数模板(函数中的一个模板参数能够改变),以下函数B,其模板参数a须要根据须要改变,设定这个函数的模板参数a而避免使用全局变量 def B(x): return a * 2 + x
经过类方法实现对一个函数参数的改变code
class define_fun: def A(self,a): self.a = a def B(self,x): return 2*self.a + x DE = define_fun() #1.引入类 DE.A(3) #2.经过类方法设定另外一个函数的参数 a res = DE.B(5) #3.根据设定的参数,计算结果 print(res) #输出11
经过全局变量,实现对一个函数的参数的改变作用域
def A(a): return a def B(x): return a * 2 + x a = A(3) #1.定义一个变量a res = B(5) #2.函数B中没有设定参数a的值,会自动寻找外层的变量,即全局变量a,而后计算结果 print(res) #输出11
经过闭包,实现对一个函数的参数的改变模板
def A1(a): def B1(y): return 2*a+y return B1 funB = A1(3) #1.直接设定B1函数的模板参数a,返回的是改变模板参数a后的函数B1 (而A1函数内部的变量a会随该行执行结束而销毁) # 此时的funB应为函数B1(y),且return 2*3 +y res = funB(5) #2.使用设定好参数的B函数,计算结果 print(res) #输出11
总之:class
三个方法都会有改变参数后的函数B 可是前面两个方法都有一个额外变量a/self.a一直存在 而使用闭包时,funB = A1(3)执行完毕后,变量a会随着做用域(函数A1)的消失而销毁.比前二者更好
闭包理解:变量
利用外层函数,设定内层函数的模板参数(内层函数是一个灵活的函数,它的模板参数能够灵活改变) 返回已设定好参数的内层函数供后面使用!
建立闭包函数:引用
闭包函数必须有内嵌函数 内嵌函数须要引用该嵌套函数上一级函数中的变量 闭包函数必须返回内嵌函数
此外:模板参数,为自创的,哈哈,即函数内部使用却没有在函数内部定义的参数方法