函数闭包
在嵌套的函数中,如果内嵌函数包含对外部函数作用域(而非全局作用域)中变量的引用,那么该内嵌函数就是闭包函数,简称闭包(Closures)
闭包中被内部函数引用的变量,不会因为外部函数结束而被释放掉,而是一直存在内存中,直到内部函数被调用结束。
# 举一个简单的例子:
x=1
def outer():
x=2
def inner():
print(x)
return inner
func=outer()
func() # 结果为2
闭包的用途
# 方式一:之前我们给函数传值是以参数的方式进行传值
import requests
def get(url):
return requests.get(url).text
# 方式二:现在可以将值包给函数
def page(url):
def get():
return requests.get(url).text
return get
# 这样做的好处是:方式一在下载同一页面时需要重复传入url,而方式二只需要传一次值,就会得到一个包含指定url的闭包函数,以后调用该闭包函数无需再传url
# 方式一下载同一页面
get('https://www.python.org')
get('https://www.python.org')
get('https://www.python.org')
# 方式二下载同一页面
python=page('https://www.python.org')
python()
python()
python()
判断闭包
函数名.closure 在函数是闭包函数时,返回一个cell元素;不是闭包时,返回None
def func():
name = 'liming'
def inner():
print(name)
print(inner.__closure__) # (<cell at 0x0000027C14EB85E8: str object at 0x0000027C14F54960>,)
return inner
name = 'liming'
def func():
def inner():
print(name)
print(inner.__closure__) # 返回None
return inner