作為一種編程語言特性,閉包得到了很多編程語言的支持,Python也不例外,所謂閉包,在Python中指的是攜帶一個或多個自由量的函式,閉包函式的自由量不是函式的引數,而是生成這個函式時的環境變數,一旦閉包生成了,自由變數會系結在函式上,即使離開創造它的環境,自由量依舊有效,總結一下,閉包的概念有以下三個要點,
- 閉包是一個函式
- 閉包函式是由其他代碼生成的
- 閉包函式攜帶了生成環境的資訊
有一個很好的例子可以幫助初學者理解閉包,我們知道,幾乎所有的計算模塊,比如Python內置的標準數學模塊math,提供的對數函式只能計算以2為底、以e為底和以10為底的三種對數,
>>> import math
>>> math.log(math.e) # 回傳以e為底e的對數
1.0
>>> math.log2(4) # 回傳以2為底4的對數
2.0
>>> math.log10(1000) # 回傳以10為底1000的對數
3.0
如果想要計算以a為底b的對數,則需要使用對數換底公式,
l o g a b = l o g 10 b l o g 10 a log_ab=\frac{log_{10}b}{log_{10}a} loga?b=log10?alog10?b?
>>> def glog(b, a): # 回傳以a為底b的對數
return math.log(b)/math.log(a)
>>> glog(25, 5) # # 回傳以5為底25的對數
2.0
我們固然可以像上面的代碼那樣定義一個函式glog(),計算以任意數為底的對數,但每次總要輸入兩個引數,和math模塊的log()、log2()、log10()函式風格不一致,如果使用閉包,就能生成和math風格一致的對數函式,
>>> def log_factory(n): # 定義一個閉包生成函式
def log_n(x): # 生成閉包
return math.log(x)/math.log(n) # 閉包中攜帶了環境引數n
return log_n # 回傳閉包
>>> log5 = log_factory(5) # 用閉包生成器生成閉包
>>> log7 = log_factory(7) # 用閉包生成器生成閉包
>>> log5(25) # 該閉包攜帶的自由量是5
2.0
>>> log7(49) # 該閉包攜帶的自由量是7
2.0
以上代碼,首先設計了一個對數函式生成器log_factory(),輸入一個整數n,就回傳一個以n為底的對數函式,繼而用這個生成器生成了兩個閉包函式,一個名為log5,一個名為log7,最后驗證一下,一切都和我們想象的完全一樣,
本文參考的例子,選自我的新書《Python高手修煉之道》,書中類似的例子還有很多,該書今天已在京東和當當網正式上線預售,雙十一期間優惠力度空前(優惠活動時間:11月9日~11月11日),如果覺得這本書還不錯,就不要錯過時機,想要簽名的同學,請關注公眾號“Python作業輔導員”,回復“Python高手修煉之道”,即可收到如何購買簽名版的說明,


渠道一:京東自營圖書
- 優惠活動時間:11月9日~11日

渠道二:當當自營圖書
- 活動時間:11月9日~11日

渠道三:作者簽名
- 關注公眾號“Python作業輔導員”
- 回復“Python高手修煉之道”,即可收到如何購買簽名版的說明
價格和優惠措施以各平臺實際發布為準,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/204983.html
標籤:其他
上一篇:Python入門基礎語法知識3
