<tr id="ieeco"><small id="ieeco"></small></tr>
<acronym id="ieeco"></acronym>

理解Python閉包,這應該是最好的例子

作為一種編程語言特性,閉包得到了很多編程語言的支持,Python也不例外。所謂閉包,在Python中指的是攜帶一個或多個自由量的函數。閉包函數的自由量不是函數的參數,而是生成這個函數時的環境變量。一旦閉包生成了,自由變量會綁定在函數上,即使離開創造它的環境,自由量依舊有效??偨Y一下,閉包的概念有以下三個要點。

  • 閉包是一個函數
  • 閉包函數是由其他代碼生成的
  • 閉包函數攜帶了生成環境的信息

有一個很好的例子可以幫助初學者理解閉包。我們知道,幾乎所有的計算模塊,比如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高手修煉之道”,即可收到如何購買簽名版的說明

價格和優惠措施以各平臺實際發布為準。

已標記關鍵詞 清除標記
相關推薦
??2020 CSDN 皮膚主題: 代碼科技 設計師:Amelia_0503 返回首頁
實付 15.20元
使用余額支付
點擊重新獲取
掃碼支付
錢包余額 0

抵扣說明:

1.余額是錢包充值的虛擬貨幣,按照1:1的比例進行支付金額的抵扣。
2.余額無法直接購買下載,可以購買VIP、C幣套餐、付費專欄及課程。

余額充值
彩票送彩金