因?yàn)樽罱肟偨Y(jié)一下閉包和裝飾器,有點(diǎn)細(xì)節(jié)總是理不順,于是找了一下B站上播放量大的,其中一個(gè)下面評(píng)論很多都說(shuō)講的很好,但是我聽(tīng)了一下,關(guān)于閉包的地方講解的就有明顯錯(cuò)誤。與fluent python和effective python上有矛盾,其實(shí)python cookbook上也沒(méi)說(shuō)一定是函數(shù)作為參數(shù),只是說(shuō)可以。但是B站有些視頻講解時(shí),竟然說(shuō)閉包一定是傳入的參數(shù)是函數(shù),其實(shí)這個(gè)就差遠(yuǎn)了。所以大家看一些東西時(shí),最好還是看經(jīng)典教材,畢竟網(wǎng)上一些講解的視頻,沒(méi)有經(jīng)過(guò)審核,再者講解者自身水平參差不齊。
我們提供的服務(wù)有:網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、蔡甸ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的蔡甸網(wǎng)站制作公司
總結(jié)后,發(fā)現(xiàn)裝飾器真是個(gè)好東西,靈活方便。裝飾器是通過(guò)閉包來(lái)實(shí)現(xiàn)的,可以這么說(shuō)兩者之間的關(guān)系。
fluent python 2nd中關(guān)于閉包的說(shuō)法。
A closure is a function-let’s call it f – with an extend scope that encompasses variables referenced in the body of f that are not global variables nor local variables of f. Such variables must come from the local scope of an outer function which encompasses f. It does not matter whether the function is anonymous or not; what matters is that it can access nonglobal variables that are defined outside of its body.
閉包是一個(gè)函數(shù) f +一個(gè)/些變量,這些變量在閉包內(nèi)引用,但是不是global變量也不是f的局部變量。這些變量必須來(lái)自包含函數(shù)f的外部函數(shù)的局部區(qū)域。函數(shù)是不是匿名函數(shù)無(wú)所謂,關(guān)鍵是f可以訪問(wèn)那些定義在 f 外部的非全局變量。書(shū)中給了一個(gè)圖例,很清晰,到底什么是閉包。
從這個(gè)圖的定義來(lái)看,閉包是函數(shù)并且這個(gè)函數(shù)可以訪問(wèn)非global的自由變量。當(dāng)然一般閉包首先涉及到嵌套函數(shù)(函數(shù)內(nèi)有函數(shù)),也涉及到高階函數(shù)(傳入的參數(shù)是函數(shù)或者返回值是函數(shù))。但是并不像有些人講的那樣,閉包一定是傳入函數(shù)。
如下是閉包的一個(gè)典型用法,這里閉包外的函數(shù)沒(méi)有參數(shù)的。
def make_averager(): count = 0 total = 0 def averager(new_value): nonlocal count,total count += 1 total += new_value return total/count return averager # 返回的是函數(shù),帶括號(hào)返回的函數(shù)運(yùn)行結(jié)果 avg = make_averager() # an object of function make_averager print(avg.__name__) # the name is averager avg(10) avg(11) res = avg(13) res = avg(14) print(res)