<input id="0qass"><u id="0qass"></u></input>
  • <input id="0qass"><u id="0qass"></u></input>
  • <menu id="0qass"><u id="0qass"></u></menu>

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

    作為一種編程語言特性,閉包得到了很多編程語言的支持,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高手修煉之道”,即可收到如何購買簽名版的說明

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

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

    抵扣說明:

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

    余額充值
    多乐彩