闭包概念
闭包,又称闭包函数或者闭合函数,其实和前面讲的嵌套函数类似,不同之处在于,闭包中外部函数返回的不是一个具体的值,而是一个函数。一般情况下,返回的函数会赋值给一个变量,这个变量可以在后面被继续执行调用。
def outter():
name = "test"
def inner():
print("from inner,name is%s" % name)
return "inner函数"
return inner
a = outter()
print(a.__name__)
print(a())
----------------
运行结果如下
inner
from inner,name istest
inner函数
以上就是个闭包函数的典型示例,有如下特征:
- 一个外部函数outter内部会包裹多个inner子函数,因为函数的作用域关系,对inner函数而言,outer函数的name相对来说就是全局变量,
- inner 函数结束后 必须有个return inner 进行函数返回
outter的返回值指示inner函数的内存地址
闭包应用场景
闭包的实际应用场景更多在于异步调用(协程和多线程的异步).因为异步调用,函数每次执行完成需要的时间不同,有些变量无法从全局传入.最好的方式就是讲参数执行的时候就传入闭包中,因为作用域的关系.
局部变量彼此之间不会相互影响.
上面例子中 add_done_callback方法会再线程池调用完down函数以后,继续调用done函数,但是此时只能传入一个arg参数,里面的arg.result()就是前面down函数的返回值.
此时无法传入filename参数,也无法设置全局变量,因为我们要实现保存的文件名是不同的.
解决办法
办法1: 我们把filename这个参数也写入down的返回值中
办法2: 就是使用闭包函数,将filename参数传入闭包outter函数,在其outter内部作为全局变量,就可以将闭包体内将filename传入.
而且outter函数运行的时候会单独创建一个独立的内存栈.多线程并发运行的三个outter函数是作用与不同的内存地址的.所以他们内部的局部变量也是各自独立.