閉包 學習閉包前先要知道 函數名的運用 函數名就是一個變量,可是他是一個特殊的變量,與括號配合能夠執行函數的變量。 1.函數名的內存地址 def func(): print('hello') print(func) 結果: <function func at 0x10ef39ea0> 2.函數名能夠賦值給其餘變量 def func(): print("hello") print(func) a = func # 把函數當成一個變量賦值給另外一個變量 a() #函數調用func() 結果: <function func at 0x10a5a5ea0> hello 3.函數名能夠當作容器類的元素 def func1(): print("呵") def func2(): print("呵") def func3(): print("呵") def func4(): print("呵") lst = [func1, func2, func3] for i in lst: i() 結果: 呵 呵 呵 4.函數名能夠當作函數的參數 def func(): print("吃了了麼") def func2(fn): print("我是func2") fn() # 執行傳遞過來的fn print("我是func2") func2(func) # 把函數func當成參數傳遞給func2的參數fn. 結果: 我是func2 吃了了麼 我是func2 5.函數名能夠做爲函數的返回值 def func_1(): print("這⾥是函數1") def func_2(): print("這⾥是函數2") print("這⾥是函數1") return func_2 fn = func_1() # 執行函數1. 函數1返回的是函數2, 這時fn指向的就是上⾯函數2 fn() # 執⾏上面返回的函數 結果: 這⾥是函數1 這⾥是函數1 這⾥是函數2 閉包: 閉包就是內層函數對外層函數(非全局)的變量的引用。叫閉包。 咱們能夠使用__closure__來檢測函數是不是閉包. 使用函數名.__closure__返回cell就是閉包. 返回None就不是閉包 def outer(): name = "我愛你中國" # 內部函數 def inner(): print(name) return inner fn = outer() # 訪問外部函數, 獲取到內部函數的函數地址 fn() # 訪問內部函數 print(fn.__closure__) def fu(): print('e') fu() print(fu.__closure__) 結果: 我愛你中國 (<cell at 0x104994708: str object at 0x1049ee2a0>,) e None def outer(): name = "我愛你中國" # 內部函數 def inner(): print(name) return inner fn = outer() # 訪問外部函數, 獲取到內部函數的函數地址 fn() # 訪問內部函數 結果: 我愛你中國 def func1(): def func2(): def func3(): print("嘿嘿") return func3 return func2 func1()()() 結果: 嘿嘿 閉包好處: 因爲咱們在外界能夠訪問內部函數. 那這個時候內部函數訪問的時間和時機 就不必定了, 由於在外部, 咱們能夠選擇在任意的時間去訪問內部函數. 這個時候. 想想. 咱們以前說過, 若是一個函數執行完畢. 則這個函數 中的變量以及局部命名空間中的內容都將會被銷燬. 在閉包中. 若是變量被 銷燬了. 那內部函數將不能正常執行.因此,python規定. 若是你在內部函 數中訪問了外層函數中的變量. 那麼這個變量將不會消亡. 將會常駐在內存中. 也就是說. 使⽤用閉包, 能夠保證外層函數中的變量在內存中常駐.