闭包:闭是封闭(函数内部的函数),包是包含(该函数内部函数对外部做用域而非全局做用据的变量的应用)。闭包
闭包是指:函数内部对外部做用于而非全局做用域的引用。函数
闭包函数: 传参的另一种方式, 参数+函数包在一块儿返回出去网站
def outter(): x = 1 def inter(): print(x) return inter f = outter() def f2(): x = 2 f() f2() #输出: 1
俩种为函数传参的方式url
为函数传参的方式一:使用参数的形式code
def func(x): print(x) func(1) func(2) func(3) #输出: 1 2 3
为函数传参的方式二:包给函数对象
def outter(x): x = 1 def inner(): print(x) return inner f = outter(1) f() # 查看闭包的元素 print(f.__closure__[0].cell_contents) #输出: 1 1 1
闭包的意义:返回的函数对象,不单单是一个函数对象,在该函数外还包裹了一层做用域,这使得,该函数不管在何处调用,有限使用本身外层包裹的做用域。作用域
应用领域:延迟计算(原来是传参,如今是包起来),爬虫领域。get
import requests def get(url): response = requests.get(url) print(url) get('https://www.baidu.com') get('https://www.baidu.com') get('https://www.baidu.com') # 输出: https://www.baidu.com https://www.baidu.com https://www.baidu.com
上面的方式比较复杂,若是用默认参数解决网站,能够考虑用闭包的方式。requests
import requests def outter(url): def get(): response = requests.get(url) print(url) return get baidu = outter('http://www.baidu.com') baidu() baidu() baidu() #输出: http://www.baidu.com http://www.baidu.com http://www.baidu.com