- 简而言之,闭包就是把数据封装到一个包(区域)中,使用时再到里面取
- 本质上,闭包是基于函数嵌套而发展出来的特殊嵌套
- 闭包应用场景1:封装数据防止全局污染
def func(age):
name = "Teacher Tao"
def f1():
print(name, age)
return
def f2():
print(name, age)
return
def f3():
print(name, age)
return
f1()
f2()
f3()
return
func(18)
- 止面代码把变量
name
与f1(), f2(), f3()
这些函数都封装在一起,供这个函数内部调用 - 闭包应用场景2:封装数据到一个包里,内部函数要想被外部调用,需要返回内部函数地址
def task(arg):
def inner():
print(arg)
return
return inner
v1 = task(11)
v2 = task(22)
v3 = task(33)
v1()
v2()
v3()
from concurrent.futures.thread import ThreadPoolExecutor
import requests
def task(url):
res = requests.get(
url = url,
head = {"user-agent": "..."}
)
return
def outer(filename):
def done(arg):
content = arg.result()
with open(filename, mode = 'wb') as file_object:
file_object.write(content)
return
return done
POOL = ThreadPoolExecutor(10)
VIDEO_LIST = [
("filename1", "url1"),
("filename2", "url2"),
("filename3", "url3")
]
for item in VIDEO_LIST:
future = POOL.submit(task, url = item[1])
future.add_done_callback(outer(itme[0]))
add_done_callback
这个回调函数参数只能是一个函数,这个函数只能有一个参数,代表请求的返回内容- 因此,在13行的文件名就不能传不同值,为了解决这个问题才定义一个外部函数,第10行,这样可以把文件名变量值传入