快速理解闭包

闭包是一个颇有意思的东西,理解起来很绕,可是理解后很简单,网上的讲解也朦朦胧胧的.根据本身的理解解释一番: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)的消失而销毁.比前二者更好

闭包理解:变量

利用外层函数,设定内层函数的模板参数(内层函数是一个灵活的函数,它的模板参数能够灵活改变)
返回已设定好参数的内层函数供后面使用!

建立闭包函数:引用

闭包函数必须有内嵌函数
内嵌函数须要引用该嵌套函数上一级函数中的变量
闭包函数必须返回内嵌函数

此外:模板参数,为自创的,哈哈,即函数内部使用却没有在函数内部定义的参数方法

相关文章
相关标签/搜索