快速理解闭包
< 返回列表时间: 2020-06-02来源:OSCHINA
闭包是一个很有意思的东西,理解起来很绕,但是理解后很简单,网上的讲解也朦朦胧胧的.根据自己的理解解释一番:
预备知识:函数中的作用域 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
通过类方法实现对一个函数参数的改变 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
总之: 三个方法都会有改变参数后的函数B 但是前面两个方法都有一个额外变量a/self.a一直存在 而使用闭包时,funB = A1(3)执行完毕后,变量a会随着作用域(函数A1)的消失而销毁.比前两者更好
闭包理解: 利用外层函数,设定内层函数的模板参数(内层函数是一个灵活的函数,它的模板参数可以灵活改变) 返回已设定好参数的内层函数供后面使用!
创建闭包函数: 闭包函数必须有内嵌函数 内嵌函数需要引用该嵌套函数上一级函数中的变量 闭包函数必须返回内嵌函数
此外:模板参数,为自创的,哈哈,即函数内部使用却没有在函数内部定义的参数
热门排行