1.啰嗦一下
學這個知識點的時候,我本來想先了解下定義, 知道個大概再說, 翻了幾篇博客,基本上都是有例子帶着進入理解這塊。即使讀了定義,思想還是不能顯出個框架。 想吃快餐,有些行,有些就不可以(這里僅代表我自己)。
有個詞叫格物致知,《現代漢語詞典》2012年發行的第六版將“格物致知”解釋為:“推究事物的原理,從而獲得知識。”
以后學習着急的時候就用這個詞 “格物致知” 來先放慢腳步。
2.定義
字面的定義:閉包是由函數及其相關的引用環境組合而成的實體(即:閉包=函數+引用環境)
3.舉個栗子,再解釋一下
看例子
函數可以作為另一個函數的參數或返回值,可以賦給一個變量。函數可 以嵌套定義,即在一個函數內部可以定義另一個函數,有了嵌套函數這種結構,便會產生閉包問題。
內嵌函數inF(),引用了外層函數的變量sum,
當我們用不同參數調用outF()是,得到的結果是隔離的
也就是說每次調用outF()函數后都將生成並保存一個新的局部變量sum。其實這里outF()函數返回的就是閉包。
在函數式語言中,當內嵌函數體內引用到體外的變量時,將會把定義時涉及到的引用環境和函數體打包成一個整體(閉包)返回。
現在給出引用環境的定義就 容易理解了:引用環境是指在程序執行中的某個點所有處於活躍狀態的約束(一個變量的名字和其所代表的對象之間的聯系)所組成的集合。閉包的使用和正常的函 數調用沒有區別。
4.再舉個栗子,內嵌函數帶參數
這里c返回的就是內嵌函數addy()
c(10)也就是指addy(10),
5.閉包的用途
用途1,當閉包執行完后,仍然能夠保持住當前的運行環境。
用途2,閉包可以根據外部作用域的局部變量來得到不同的結果,這有點像一種類似配置功能的作用,我們可以修改外部的變量,閉包根據這個變量展現出不同的功能。
6.總結如何創建一個閉包
在Python中創建一個閉包可以歸結為以下三點:
函數內嵌函數;
內嵌函數需要引用上一級namespace中的變量;
外圍函數必須返回內嵌函數;
通過這三點,就可以創建一個閉包,Python裝飾器就是使用了閉包。
參考:
https://www.cnblogs.com/JohnABC/p/4076855.html
https://www.jianshu.com/p/1de5db830a44?utm_campaign