最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中的閉包用法實(shí)例詳解

 更新時(shí)間:2015年05月05日 10:56:41   作者:ma6174  
這篇文章主要介紹了python中的閉包用法,以實(shí)例形式詳細(xì)分析了Python中閉包的概念及相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下

本文實(shí)例講述了python中的閉包用法。分享給大家供大家參考。具體分析如下:

什么是閉包?

簡單說,閉包就是根據(jù)不同的配置信息得到不同的結(jié)果

再來看看專業(yè)的解釋:閉包(Closure)是詞法閉包(Lexical Closure)的簡稱,是引用了自由變量的函數(shù)。這個(gè)被引用的自由變量將和這個(gè)函數(shù)一同存在,即使已經(jīng)離開了創(chuàng)造它的環(huán)境也不例外。所以,有另一種說法認(rèn)為閉包是由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實(shí)體。

python實(shí)例:

看概念總是讓人摸不著頭腦,看幾個(gè)python小例子就會了

例1

def make_adder(addend):
  def adder(augend):
    return augend + addend
  return adder
p = make_adder(23)
q = make_adder(44)
print p(100)
print q(100)

運(yùn)行結(jié)果:

123
144

分析一下:

我們發(fā)現(xiàn),make_adder是一個(gè)函數(shù),包括一個(gè)參數(shù)addend,比較特殊的地方是這個(gè)函數(shù)里面又定義了一個(gè)新函數(shù),這個(gè)新函數(shù)里面的一個(gè)變量正好是外部make_adder的參數(shù).也就是說,外部傳遞過來的addend參數(shù)已經(jīng)和adder函數(shù)綁定到一起了,形成了一個(gè)新函數(shù),我們可以把a(bǔ)ddend看做新函數(shù)的一個(gè)配置信息,配置信息不同,函數(shù)的功能就不一樣了,也就是能得到定制之后的函數(shù).

再看看運(yùn)行結(jié)果,我們發(fā)現(xiàn),雖然p和q都是make_adder生成的,但是因?yàn)榕渲脜?shù)不同,后面再執(zhí)行相同參數(shù)的函數(shù)后得到了不同的結(jié)果.這就是閉包.

例2

def hellocounter (name):
  count=[0] 
  def counter():
    count[0]+=1
    print 'Hello,',name,',',str(count[0])+' access!'
  return counter
hello = hellocounter('ma6174')
hello()
hello()
hello()

執(zhí)行結(jié)果

Hello, ysisl , 1 access!
Hello, ysisl , 2 access!
Hello, ysisl , 3 access!

分析一下

這個(gè)程序比較有趣,我們可以把這個(gè)程序看做統(tǒng)計(jì)一個(gè)函數(shù)調(diào)用次數(shù)的函數(shù).count[0]可以看做一個(gè)計(jì)數(shù)器,沒執(zhí)行一次hello函數(shù),count[0]的值就加1。也許你會有疑問:為什么不直接寫count而用一個(gè)列表?這是python2的一個(gè)bug,如果不用列表的話,會報(bào)這樣一個(gè)錯(cuò)誤:

UnboundLocalError: local variable 'count' referenced before assignment.

什么意思?就是說conut這個(gè)變量你沒有定義就直接引用了,我不知道這是個(gè)什么東西,程序就崩潰了.于是,再python3里面,引入了一個(gè)關(guān)鍵字:nonlocal,這個(gè)關(guān)鍵字是干什么的?就是告訴python程序,我的這個(gè)count變量是再外部定義的,你去外面找吧.然后python就去外層函數(shù)找,然后就找到了count=0這個(gè)定義和賦值,程序就能正常執(zhí)行了.

python3 代碼

def hellocounter (name):
  count=0 
  def counter():
    nonlocal count
    count+=1
    print 'Hello,',name,',',str(count[0])+' access!'
  return counter
hello = hellocounter('ma6174')
hello()
hello()
hello()

例3

def makebold(fn):
  def wrapped():
    return "<b>" + fn() + "</b>"
  return wrapped
def makeitalic(fn):
  def wrapped():
    return "<i>" + fn() + "</i>"
  return wrapped
@makebold
@makeitalic
def hello():
  return "hello world"
print hello()

執(zhí)行結(jié)果

<b><i>hello world</i></b>

簡單分析

怎么樣?這個(gè)程序熟悉嗎?這不是傳說的的裝飾器嗎?對,這就是裝飾器,其實(shí),裝飾器就是一種閉包,我們再回想一下裝飾器的概念:對函數(shù)(參數(shù),返回值等)進(jìn)行加工處理,生成一個(gè)功能增強(qiáng)版的一個(gè)函數(shù)。再看看閉包的概念,這個(gè)增強(qiáng)版的函數(shù)不就是我們配置之后的函數(shù)嗎?區(qū)別在于,裝飾器的參數(shù)是一個(gè)函數(shù)或類,專門對類或函數(shù)進(jìn)行加工處理。

python里面的好多高級功能,比如裝飾器,生成器,列表推到,閉包,匿名函數(shù)等,開發(fā)中用一下,可能會達(dá)到事半功倍的效果!

希望本文所述對大家的Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • python得到windows自啟動(dòng)列表的方法

    python得到windows自啟動(dòng)列表的方法

    今天小編就為大家分享一篇python得到windows自啟動(dòng)列表的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • python+logging+yaml實(shí)現(xiàn)日志分割

    python+logging+yaml實(shí)現(xiàn)日志分割

    這篇文章主要為大家詳細(xì)介紹了python+logging+yaml實(shí)現(xiàn)日志分割,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 使用SimpleITK讀取NII格式三維圖像及注意事項(xiàng)說明

    使用SimpleITK讀取NII格式三維圖像及注意事項(xiàng)說明

    這篇文章主要介紹了使用SimpleITK讀取NII格式三維圖像及注意事項(xiàng)說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Keras中的兩種模型:Sequential和Model用法

    Keras中的兩種模型:Sequential和Model用法

    這篇文章主要介紹了Keras中的兩種模型:Sequential和Model用法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • python中json.dumps和json.dump區(qū)別

    python中json.dumps和json.dump區(qū)別

    json.dumps將Python對象序列化為JSON字符串,json.dump直接將Python對象序列化寫入文件,本文就來介紹一下兩個(gè)的使用及區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-12-12
  • Anaconda環(huán)境克隆、遷移的詳細(xì)步驟

    Anaconda環(huán)境克隆、遷移的詳細(xì)步驟

    最近需要在多臺計(jì)算機(jī)上工作,每次重新部署環(huán)境比較麻煩,所以學(xué)習(xí)一下anaconda環(huán)境遷移的方法,下面這篇文章主要給大家介紹了關(guān)于Anaconda環(huán)境克隆、遷移的詳細(xì)步驟,需要的朋友可以參考下
    2022-08-08
  • Python數(shù)據(jù)分析之?Pandas?Dataframe條件篩選遍歷詳情

    Python數(shù)據(jù)分析之?Pandas?Dataframe條件篩選遍歷詳情

    這篇文章主要介紹了Python數(shù)據(jù)分析之?Pandas?Dataframe條件篩選遍歷詳情,查詢Pandas?Dataframe數(shù)據(jù)時(shí),經(jīng)常會篩選出符合條件的數(shù)據(jù),關(guān)于其使用方式,需要的小伙伴可以參考一下下面文章內(nèi)容
    2022-05-05
  • Pandas.DataFrame轉(zhuǎn)置的實(shí)現(xiàn)

    Pandas.DataFrame轉(zhuǎn)置的實(shí)現(xiàn)

    這篇文章主要介紹了Pandas.DataFrame轉(zhuǎn)置的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • python連接mongodb集群方法詳解

    python連接mongodb集群方法詳解

    這篇文章主要介紹了python連接mongo集群方法詳解,需要的朋友可以參考下
    2020-02-02
  • Python實(shí)現(xiàn)簡單字典樹的方法

    Python實(shí)現(xiàn)簡單字典樹的方法

    這篇文章主要介紹了Python實(shí)現(xiàn)簡單字典樹的方法,實(shí)例分析了Python字典樹的定義、實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下
    2016-04-04

最新評論

长子县| 大厂| 蕉岭县| 铁岭市| 盘山县| 阿勒泰市| 岱山县| 华安县| 视频| 莱州市| 买车| 思南县| 中阳县| 瑞丽市| 无极县| 封丘县| 广灵县| 全椒县| 襄汾县| 屯昌县| 西青区| 普兰店市| 菏泽市| 武宣县| 卢湾区| 宁阳县| 嘉峪关市| 郧西县| 石门县| 高尔夫| 伊金霍洛旗| 新河县| 赤水市| 夏河县| 固阳县| 安宁市| 兴国县| 行唐县| 象州县| 泗阳县| 安泽县|