springboot1.5.x 第三部分 瀏覽器使用者名稱密碼加入驗證碼
作為一種程式語言特性,閉包得到了很多程式語言的支援,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}
>>> 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高手修煉之道”,即可收到如何購買簽名版的說明
價格和優惠措施以各平臺實際釋出為準。