標籤:傳回值 條件 alt print 作用 技術 png 程式 內嵌
---恢複內容開始---
使用像javascript和python這樣支援物件導向範式的語言進行編程時,都會涉及到閉包的概念以及閉包的使用。我們今天就從這兩個方面來討論一下閉包:
首先是維基百科中關於閉包的概念:
在一些語言中,在函數中可以(嵌套)定義另一個函數時,如果內部的函數引用了外部的函數的變數,則可能產生閉包。閉包可以用來在一個函數與一組“私人”變數之間建立關聯關係。在給定函數被多次調用的過程中,這些私人變數能夠保持其持久性。
根據這句話,其實我們自己就可以總結出在python語言中形成閉包的三個條件,缺一不可:
1)必須有一個內嵌函數(函數裡定義的函數)——這對應函數之間的嵌套
2)內嵌函數必須引用一個定義在閉合範圍內(外部函數裡)的變數——內建函式引用外部變數
3)外部函數必須返回內嵌函數——必須返回那個內建函式
前兩個條件我們比較好理解,那什麼會有第三條規定呢?其實閉包一詞指的就是上文中提到的那個“內部的函數”,我們下面就會發現,只有那個內建函式才有所謂的__closure__屬性。
我們根據上面的三準則創造了一個函數,其中的funy就是所謂的閉包,而funy內部所引用過的y就是所謂的閉包變數。
內函數裡運用了外函數的臨時變數,並且外函數的傳回值是內函數的引用。這樣就構成了一個閉包。
一般情況下,在我們認知當中,如果一個函數結束,函數的內部所有東西都會釋放掉,
還給記憶體,局部變數都會消失。
但是閉包是一種特殊情況,如果外函數在結束的時候發現有自己的臨時變數將來會在內建函式中用到,就把這個臨時變數綁定給了內建函式,然後自己再結束。
2.裝飾器
裝飾器就是閉包,但裝飾器傳入的參數是函數
因為python是一門膠水語言,在python一切皆是對象,python中全部都是參考型別
因此函數可以像變數一樣被指向和傳遞。
def diguo():
print("地鍋50")
return 50
def doupi(fn):
def jia():
print("豆皮10")
return fn()+10
return jia
def xiang(fnn):
def jia():
print("香菜")
return fnn()+5
return jia
aa=doupi(xiang(diguo))
print(aa())
這樣寫起來是不是挺亂的,在python中實現了文法糖
看見@方法名了嗎?那就是python內建的文法糖為了簡寫也可以取到和裝飾器調用一樣的效果,這樣的程式看起來是不是就簡潔了很多
在設計模式中裝飾器就如同他的名字一樣把他裝飾起來
裝飾器是一個很著名的設計模式,經常被用於有切面需求的情境,較為經典的應用有插入日誌、增加計時邏輯來檢測效能、加入交易處理等。裝飾器是解決這類問題的絕佳設計,有了裝飾器,我們就可以抽離出大量函數中與函數功能本身無關的雷同代碼並繼續重用。概括的講,裝飾器的作用就是為已經存在的對象添加額外的功能。
python中閉包和裝飾器