閉包和裝飾器

2021-09-26 20:10:16 字數 2488 閱讀 5166

函式內的屬性,都有生命週期,都是在函式執行期間

內部函式對外部函式 作用域 裡 變數 的引用

閉包內的閉包函式私有化了變數,完成了資料的封裝,類似於物件導向

在不影響原有函式功能前提下,還能新增新的功能

基於閉包

def func():

a = 1

print(id(a))

print('this is func.')

def func1(num):

print("this is func1")

print(num + a)

print(id(a))

return func1

var = func()

var(3)

從上例可以看出

骨架核心**:

def func():

def func1(num):

...return func1

var = func

通過函式中定義函式,進行返回,達到在函式外可以得到函式內的引數

即通過將 c 返回出來,可以得到 b 內的資訊

其中,在 example 1中兩個 a 的位址相同

print('你好,我是 print')

裝飾器內部實現:

return func 返回了函式物件,相當於返回的是 func()

return func() 返回了乙個 函式呼叫

1 func1(myprint)() —> func2 # 接收被裝飾的函式作為引數,而且還要繼續呼叫一次

2 func2() ----> print(『aaabbb』) ----> return func() ----> print(『你好,我是print』)

核心**

def func1(func):

def func2():

return func()

return func2

通過閉包豐富內容,傳參,執行本身函式

arg_func(*** = 'man')()() ---> func1

func1() ---> func2

func2() ---> ('你不可以生娃') or ('你不可以生娃') b_func

def arg_func(***):

def func1(b_func):

def func2():

if *** == 'man':

print('你不可以生娃')

if *** == 'woman':

print('你可以生娃')

return b_func()

return func2

return func1

@arg_func(*** = 'man')

def man():

print('好好上班')

@arg_func(*** = 'woman')

def woman():

print('好好上班')

man()

woman()

def func1(func):

def func2(x, y):

print(x, y)

x = 'a'

y = 'b'

return func(x, y)

return func2

@func1

def mysum(a, b): # 實現 a = a + 5

print(a + b)

mysum(1,2)

閉包和裝飾器

叫什麼 閉包有什麼用 跟函式相對可以把外層函式的引數保留下來 怎麼寫 def 外層函式 引數 def 內層函式 pass return 內層函式 心法 兩個函式的巢狀,外層函式返回內層函式的引用,外層函式必須有引數func 裝飾前的test,call fun 三者引數一樣的 def set fun ...

閉包和裝飾器

閉包 兩個函式的巢狀,外部函式返回內部函式的引用,外部函式一定有引數 def 外部函式 引數 def 內部函式 pass return 內部函式 他跟函式之間的區別 1.格式兩個函式巢狀 2.閉包外部函式的引數可以在記憶體中保持 裝飾器是什麼 閉包加 裝飾器的作用 在不改變原先的函式值跟呼叫的方式,...

閉包和裝飾器

在python中建立乙個閉包可以歸結為以下三點 閉包思考 1.閉包似優化了變數,原來需要類物件完成的 作,閉包也可以完成 2.由於閉包引 了外部函式的區域性變數,則外部函式的區域性變數沒有及時釋放,消耗記憶體 裝飾器 開放封閉原則 封閉 已實現的功能 塊 開放 對擴充套件開發 例子 def w1 f...