引言: 閉包在很多程序設計語言中都有出現,比如我們在網站開發時,經常使用的javascript中會接觸過。在python中,閉包也是一個特別重要的概念。python中的裝飾器本質上就是閉包。所以在我們介紹裝飾器時,有必要理解閉包函數。
一.理解函數
1.函數定義
def 函數返回值 functionname([參數列表]): 函數體以上就是一個函數定義的具體形式
2.函數原理
其實原先沒有函數的概念。人們開始編寫的都是順序性程序,后來人們為了提高代碼的重用性和可讀性。便設計了函數的概念。以及變量等信息放入特定的堆棧中。然后進行操作,函數結束后將參數和變量等信息彈出堆棧的過程。
3.函數的局部參數和全局參數
在函數體內定義的參數為局部參數,定義在函數外的參數為全局參數。當定義的局部參數和全局參數重名時,按照變量的解析規則來進行。先從當前函數的作用域開始查找,如果沒有發現,則再從上層的作用域查找。
```#打印全局和局部變量的值 a="123" def PRinta(): a="1234" print(a) print(a)"""當執行到printa函數內的print(a)時,從當前作用域內發現局部變量a="1234",所以此時會打印出"1234",當函數執行完后,函數printa中的a的變量已經不存在了。最后程序打印123"""有些人又會問,那我如何在函數體內訪問全局變量呢?我如何修改在函數體內修改全局變量呢? 訪問可以直接訪問,引文函數內找不到這個全局變量,就會到上一層作用域里找,最終一定會找到全局作用域里的全局變量。對全局變量進行操作,需要在函數內使用global關鍵詞即可全局變量。
#代碼示例如下:a="1234"def revisea(): global a; a="123" print(a) print(a) #這時我們發現我們都是針對全局變量進行操作,會發現結果一樣。二.嵌套函數
Python允許創建嵌套函數(java不允許)。這意味著我們可以在函數里面定義函數而且現有的作用域和變量生存周期依舊適用。
#嵌套函數示例def out(): a,b=2,3 #1 def process(a,b): #2 return a+b #3 return process(a,b) #4print(out())"""當執行到#1時,我們發現定義了a,b兩個變量,#2又定義了一個函數process,進行函數體#3,發現只是對a,b進行求和。而a,b兩個變量在在函數定義上的參數上存在,所有外部函數out中也定義了a,b變量。但此時#3中a,b只是參數列表中的局部變量。當執行到#4時,返回了process函數處理的返回值。而此時傳入process函數的a,b兩變量是在out函數作用域里的,所有最后的處理結果為5"""你們也許看到過這樣的行為:“python把頻繁要用的操作變成函數作為參數進行使用,像通過傳遞一個函數給內置排序函數的key參數從而來自定義排序規則。
def out(a,b): def inner(): return a+b return inner #返回函數,python中一切皆對象,函數是一個特殊的對象 myinner=out(1,2) """ 針對這樣一個嵌套函數來說,程序只提供了一個外部函數調用out,根本無法直接調用內部函數inner,inner函數也會隨之消失。所有我們在out函數返回時,直接返回inner函數名。并保存在一個變量myinner中,最后調用相應的函數即可。 """但是從變量的生存周期來看,該怎么理解呢?我們的變量a,b是函數out的一個本地變量,這意味著只有當函數out正在運行的時候才會存在。根據我們已知的python運行模式,我們沒法在函數outer返回之后繼續調用函數inner,在函數inner被調用的時候,變量a,b早已不復存在,可能會發生一個運行時錯誤。 萬萬沒想到,返回的函數inner居然能夠正常工作。Python支持一個叫做函數閉包的特性,用人話來講就是,嵌套定義在非全局作用域里面的函數能夠記住它在被定義的時候它所處的封閉命名空間。這能夠通過查看函數的func_closure屬性得出結論,這個屬性里面包含封閉作用域里面的值(只會包含被捕捉到的值,比如x,如果在out里面還定義了其他的值,封閉作用域里面是不會有的)
三.閉包
1.定義: 函數閉包:嵌套定義在非全局作用域里面的函數能夠記住它在被定義的時候它所處的封閉命名空間。(函數能夠記住他所有的封閉的上下文環境),一個函數和它的環境變量合在一起,就構成了一個閉包(closure)
2.應用 網上看到一些關于python閉包使用的案例,不過個人覺得,多數的示例都不是很貼切。其實最廣泛的應用場景就是裝飾器.我將在下一個系列中討論到裝飾器。本文部分借鑒了文章http://python.jobbole.com/81683/,我也借此機會學習了。
新聞熱點
疑難解答