python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。
首先我们来理解第一个条件:在一个内部函数里,也就是闭包是一个内嵌函数
例如:我们写一个简单的计算函数
def compute():
def add(): #此时这个add函数就是copute函数下的一个嵌套函数
pass
接下来我们看第二个条件:对外部作用域(但不是全局作用域)的变量进行引用
优化:
def compute():
a = 1
b = 2 #我们在内嵌函数外部定义了两个变量,为了让它在内嵌函数中调用
def add(): # 此时这个add函数就是copute函数下的一个嵌套函数
print(a+b) #内嵌函数调用了外部变量
至此闭包就创建完成,那我们如何使用这个闭包呢?
首先我们需使用return返回这个内嵌函数
def compute():
a = 1
b = 2 #我们在内嵌函数外部定义了两个变量,为了让它在内嵌函数中调用
def add(): # 此时这个add函数就是copute函数下的一个嵌套函数
print(a+b) #内嵌函数调用了外部变量
return add
# 接下来我们调用这个函数
#我们使用result接收compute这个函数
result=compute() #就相当于(result=compute()=add)我们间接地得到了这个内嵌函数的函数名
result() #结果:3 相当于add(),这个闭包实际上已经脱离了它的上级函数
# 再次优化
def compute(a,b):
#此时我们将之前的两个变量a,b当做compute函数下的两个形参,不管是定义两个变量还是用作形参,都是内嵌函数的外部变量
def add(): # 此时这个add函数就是copute函数下的一个嵌套函数
print(a+b) #内嵌函数调用了外部变量
return add
result=compute(3,5) #这样我们就可以动态的使用这个闭包了
result()
- 在此基础上我们还可进行扩展,我们的局限性并不是只用两个数进行相加,我们如果要用多个数进行运算,那么就使用到函数参数中的动态参数*args/**kwargs
这里就不过多演示了,大家可以自己练习一下
总结闭包的三个条件:
首先是内嵌函数
该内嵌函数调用了外部变量(不包括全局变量)
必须返回该内嵌函数