閉包:閉是封閉(函數內部的函數),包是包含(該函數內部函數對外部做用域而非全局做用據的變量的應用)。閉包
閉包是指:函數內部對外部做用於而非全局做用域的引用。函數
閉包函數: 傳參的另一種方式, 參數+函數包在一塊兒返回出去網站
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