闭包函数
一、什么是闭包
闭包:闭是封闭(函数内部函数),包是包含(该内部函数对外部作用域而非全局作用域的变量的引用)。闭包指的是:函数内部函数对外部作用域而非全局作用域的引用。简单的说闭包函数就是把变量和函数一起包起来,下次要用直接使用
def outter(x): def inner(): print(x) return inner inner = outter(2) # inner # f = inner inner() inner() inner() # 查看闭包的元素 print(F"f.__closure__[0].cell_contents: {f.__closure__[0].cell_contents}")
结果:
2
2
2
f.__closure__[0].cell_contents: 2
二、闭包函数的应用
闭包的含义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹一层作用域,这使得该函数无论在何处调用,优先先使用自己外层包裹的作用域
应用领域:延迟计算(原来我们是传参的,现在我们包裹起来)、怕成领域
import requests def get(url): response = requests.get(url) print(f"done: {url}") get('https://www.baidu.com') get('https://www.baidu.com') get('https://www.baidu.com') get('https://www.cnblogs.com/linhaifeng') get('https://www.cnblogs.com/linhaifeng') get('https://www.cnblogs.com/linhaifeng')
one: https://www.baidu.com
done: https://www.baidu.com
done: https://www.baidu.com
done: https://www.cnblogs.com/linhaifeng
done: https://www.cnblogs.com/linhaifeng
done: https://www.cnblogs.com/linhaifeng
上面的方式是极其复杂的,我们如果使用默认参数也只能解决一个网址,因此我们可以考虑使用闭包的方式。
def func(url): def get_url(): r = requests.get(url) r.raise_for_status() r.encoding = r.apparent_encoding print(f'{url}) # print(r.text[:1000]) return get_url get_baidu = func("https://www.baidu.com/") get_baidu() get_baidu() get_taobao = func('https://www.taobao.com/') get_taobao() get_taobao() get_taobao() print(get_taobao.__closure__[0].cell_contents)
结果:
url:https://www.baidu.com/
url:https://www.baidu.com/
url:https://www.taobao.com/
url:https://www.taobao.com/
url:https://www.taobao.com/
get_taobao.__closure__[0].cell_contentshttps://www.taobao.com/