版權聲明:轉載時請以超連接形式標明文章原始出處和做者信息及本聲明
http://blackgu.blogbus.com/logs/171867049.html
html
以前常常聽人提到「閉包」這個詞,當時對於我這個Java程序員來講概念仍是很模糊,當時我嘗試找了些資料去看,但仍是隻知其一;不知其二,最近一邊工做一邊學習Python,看到Python中的閉包,結合《Python Cookbook》中的對閉包的介紹真正領悟了閉包的奧祕。python
下面先舉個例子:程序員
def make_adder(addend):
def adder(augend):
return augend + addend
return adder閉包
make_adder函數裏嵌套了一個內層函數adder,這個內層函數就是一個閉包,其實能夠也不用管這個「閉包」的概念,先來看下這種模式解決些什麼問題,「閉包」只是個名稱罷了。函數
調用make_adder函數:p = make_adder(23),因爲內層的函數adder裏的邏輯用到了make_adder函數的入參,而這時這個入參addend綁定了值23,因爲make_adder函數返回的是函數adder,因此這時的p其實就是內部的addend綁定了23的函數adder;同理可知,q = make_adder(44),這裏的q就是內部addend綁定了44的函數adder,p和q這兩個adder函數是不相同的,由於內部addend綁定的值不一樣,只是兩個函數的模板相同罷了,這時咱們執行p(100)獲得結果是123,q(100)獲得結果是144。這樣作有什麼用呢?其實能夠這樣看:咱們能夠把p = make_adder(23)和q = make_adder(44)當作是配置過程,23和44是配置信息,p(100)和q(100)根據不一樣的配置得到不一樣的結果,這樣咱們就能夠解決開發中「根據配置信息不一樣得到不一樣結果」的問題學習
就拿《Python Cookbook》中的例子來闡述htm
咱們須要一個字符串過濾的功能,把一個字符串中咱們想留下的字符留下,除此以外的字符都過濾掉,這裏的「咱們想留下的字符」其實就是上面提到的"配置信息",咱們根據不一樣的配置信息得到不一樣的結果,咱們根據咱們想留下的字符獲得不一樣的過濾後的字符串,因此這裏的過濾功能函數這樣寫:blog
import string
allchars = string.maketrans('', '')
def makefilter(keep):
delchars = allchars.translate(allchars, keep)
def thefilter(s):
return s.translate(allchars, delchars)
return thefilter開發
這裏用到了python的translate,不清楚的能夠看http://docs.python.org/字符串
makefilter函數的參數是咱們想留下的字符,能夠傳一個字符串,至關於字符串裏全部的字符都要留下,makefilter函數裏有個內層函數thefilter,這個函數會獲得咱們傳入makefilter函數的想要留下的字符,根據delchars它就知道要過濾掉哪些字符,下面咱們來執行下,看下效果:
>>> just_vowels = makefilter('aeiouy') #咱們想留下aeiouy這些字符
>>> just_vowels('wwwwwwwaeiouy') #這裏的 just_vowels其實就是知道了咱們想留下的字符aeiouy後的thefilter函數
最後獲得的結果:'aeiouy'
以上就是閉包的奧祕,其實就是一個「根據不一樣配置信息獲得不一樣結果」的功能,並且咱們在開發中是常常碰到這樣的需求的,用閉包來解決真的很是好,代碼簡單易懂,並且擴展性也很是好!