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

簡單講解Python中的閉包

 更新時間:2015年08月11日 08:52:21   投稿:goldensun  
這篇文章主要介紹了Python中的閉包,是Python入門學習中的基礎知識,需要的朋友可以參考下

閉包并不是什么新奇的概念,它早在高級語言開始發(fā)展的年代就產(chǎn)生了。閉包(Closure)是詞法閉包(Lexical Closure)的簡稱。對閉包的具體定義有很多種說法,這些說法大體可以分為兩類:
一種說法認為閉包是符合一定條件的函數(shù),比如參考資源中這樣定義閉包:閉包是在其詞法上下文中引用了自由變量的函數(shù)。
另一種說法認為閉包是由函數(shù)和與其相關的引用環(huán)境組合而成的實體。比如參考資源中就有這樣的的定義:在實現(xiàn)深約束時,需要創(chuàng)建一個能顯式表示引用環(huán)境的東西,并將它與相關的子程序捆綁在一起,這樣捆綁起來的整體被稱為閉包。

就像這樣:

#python 中的閉包
... def func(data):
...   count = [data]
...   def wrap():
...     count[0] += 1
...     return count[0]
...   return wrap
... 
... a = func(1)
>>> a()
5: 2
>>> a()
6: 3

 def func(x):
...   return lambda y :y+x
>>> b = func(1)
>>> b(1)
7: 2
>>> b(2)
8: 3
>>> print b #這里b是個function 在ruby中是proc
<function <lambda> at 0x01AC68F0>


 def addx(x):
... def adder (y): return x + y
... return adder
>>> add8 = addx(8)
>>> add8(8)
9: 16

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

python實例
看概念總是讓人摸不著頭腦,看幾個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)

運行結果:

123
144

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

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

例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í)行結果

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

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

UnboundLocalError: local variable 'count' referenced before assignment.

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

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

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

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


相關文章

  • 跟老齊學Python之使用Python操作數(shù)據(jù)庫(1)

    跟老齊學Python之使用Python操作數(shù)據(jù)庫(1)

    本文詳細講述了使用python操作數(shù)據(jù)庫所需要了解的知識以及準備工作,十分的詳盡,這里推薦給想學習python的小伙伴。
    2014-11-11
  • python解析基于xml格式的日志文件

    python解析基于xml格式的日志文件

    這篇文章主要為大家詳細介紹了python如何解析基于xml格式的日志文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • python 序列解包的多種形式及用法解析

    python 序列解包的多種形式及用法解析

    這篇文章主要介紹了python 序列解包的多種形式及用法解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • python編碼問題匯總

    python編碼問題匯總

    這篇文章主要給大家分享的是python編碼問題匯總,字符編碼簡單介紹和發(fā)展史及使用方法的一些介紹,文章內(nèi)容詳細,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-03-03
  • python實現(xiàn)獲取電腦所連接的wifi密碼

    python實現(xiàn)獲取電腦所連接的wifi密碼

    電腦連接wifi后,很難直觀地看到當前連接wifi的密碼,需要借助命令行公管局才可以查看到相關信息,本文為大家介紹一下如何利用python獲取電腦所連接的wifi密碼,感興趣的可以了解下
    2023-11-11
  • 用python將pdf轉(zhuǎn)化為有聲讀物

    用python將pdf轉(zhuǎn)化為有聲讀物

    大家好,本篇文章主要講的用python將pdf轉(zhuǎn)化為有聲讀物,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • python目標檢測實現(xiàn)黑花屏分類任務示例

    python目標檢測實現(xiàn)黑花屏分類任務示例

    這篇文章主要為大家介紹了python目標檢測實現(xiàn)黑花屏分類任務示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • 使用pandas生成/讀取csv文件的方法實例

    使用pandas生成/讀取csv文件的方法實例

    在使用Pandas處理數(shù)據(jù)時,常見的讀取數(shù)據(jù)的方式時從Excel或CSV文件中獲取,這篇文章主要給大家介紹了關于如何使用pandas生成、讀取csv文件的相關資料,需要的朋友可以參考下
    2021-07-07
  • python中向二維數(shù)組中添加整行或者增列元素問題

    python中向二維數(shù)組中添加整行或者增列元素問題

    這篇文章主要介紹了python中向二維數(shù)組中添加整行或者增列元素問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Python?pygame項目實戰(zhàn)監(jiān)聽退出事件

    Python?pygame項目實戰(zhàn)監(jiān)聽退出事件

    這篇文章主要介紹了Python?pygame項目實戰(zhàn)監(jiān)聽退出事件,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08

最新評論