欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

什么是閉包?

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

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

python實(shí)例:

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

例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。也許你會(huì)有疑問:為什么不直接寫count而用一個(gè)列表?這是python2的一個(gè)bug,如果不用列表的話,會(huì)報(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>

簡(jiǎn)單分析

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

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

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

相關(guān)文章

  • Python實(shí)現(xiàn)的購(gòu)物車功能示例

    Python實(shí)現(xiàn)的購(gòu)物車功能示例

    這篇文章主要介紹了Python實(shí)現(xiàn)的購(gòu)物車功能,涉及Python通過交互與數(shù)值運(yùn)算實(shí)現(xiàn)購(gòu)物車功能的相關(guān)操作技巧,需要的朋友可以參考下
    2018-02-02
  • python中requests小技巧

    python中requests小技巧

    Requests 使用的是 urllib3,因此繼承了它的所有特性。Requests 支持 HTTP 連接保持和連接池,支持使用 cookie 保持會(huì)話,支持文件上傳,支持自動(dòng)確定響應(yīng)內(nèi)容的編碼,支持國(guó)際化的 URL 和 POST 數(shù)據(jù)自動(dòng)編碼?,F(xiàn)代、國(guó)際化、人性化。
    2017-05-05
  • Django的restframework接口框架自定義返回?cái)?shù)據(jù)格式的示例詳解

    Django的restframework接口框架自定義返回?cái)?shù)據(jù)格式的示例詳解

    這篇文章主要介紹了Django的restframework接口框架自定義返回?cái)?shù)據(jù)格式,本文介紹了通過Django的restframework接口框架自定義Response返回對(duì)象來自定義返回?cái)?shù)據(jù)格式,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • 快速解決docker-py api版本不兼容的問題

    快速解決docker-py api版本不兼容的問題

    今天小編就為大家分享一篇快速解決docker-py api版本不兼容的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • python Opencv計(jì)算圖像相似度過程解析

    python Opencv計(jì)算圖像相似度過程解析

    這篇文章主要介紹了python Opencv計(jì)算圖像相似度過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Python服務(wù)器創(chuàng)建虛擬環(huán)境跑代碼

    Python服務(wù)器創(chuàng)建虛擬環(huán)境跑代碼

    本文主要介紹了Python服務(wù)器創(chuàng)建虛擬環(huán)境跑代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • python上下文管理器使用場(chǎng)景及異常處理

    python上下文管理器使用場(chǎng)景及異常處理

    這篇文章主要為大家介紹了python上下文管理器使用場(chǎng)景及異常處理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • python人工智能tensorflow函數(shù)tf.get_variable使用方法

    python人工智能tensorflow函數(shù)tf.get_variable使用方法

    這篇文章主要為大家介紹了python人工智能tensorflow函數(shù)tf.get_variable使用方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 關(guān)于Python如何避免循環(huán)導(dǎo)入問題詳解

    關(guān)于Python如何避免循環(huán)導(dǎo)入問題詳解

    在大型的Python工程中,由于架構(gòu)設(shè)計(jì)不當(dāng),可能會(huì)出現(xiàn)模塊間相互引用的情況。下面這篇文章主要給大家介紹了關(guān)于如何避免Python的循環(huán)導(dǎo)入問題的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-09-09
  • python數(shù)據(jù)挖掘需要學(xué)的內(nèi)容

    python數(shù)據(jù)挖掘需要學(xué)的內(nèi)容

    在本篇文章中我們給大家整理了關(guān)于python數(shù)據(jù)挖掘需要學(xué)什么的知識(shí)點(diǎn)指南,有興趣的朋友們跟著參考下。
    2019-06-06

最新評(píng)論