目錄裝飾器
閉包即函式內部函式對外部作用域而非全域性作用域的引用,說白了就是將函式內部的變數拿到全域性來使用,還不會修改區域性變數的值
def outter():
x = 5
def inner():
return x
return inner
f = outter()
x = f() + 1
print(f())
print(x)
5
6
使用引數的形式
def f1(x):
print(x)
f1(1)
f1(2)
f1(5)
1
25
包給函式
def outter(x):
def inner():
print(x)
return inner
f = outter(1)
f()f1 = outter(5)
f1()
f()f1()
151
5
裝飾器就是為函式新增額外的功能
注意:不修改被裝飾物件的源**
不修改被裝飾物件的呼叫方式
裝飾器其實就是遵循以上兩大原則的前提下為被裝飾物件新增功能
如果我們定義乙個函式,需要增加乙個計時功能,我們可以使用改變源**的方式:
import time
def index():
start_time = time.time()
print('睡一秒')
time.sleep(1)
end_time = time.time()
print(end_time - start_time)
index()
睡一秒
1.0007741451263428
但這樣就不符合我們裝飾器的兩大原則了,那我們該怎麼來實現呢?
第一種:改變呼叫方式
import time
def outer(func):
start_time = time.time()
res = func()
end_time = time.time()
print(end_time - start_time)
def index():
print('睡一秒')
time.sleep(1)
outer(index)
睡一秒
1.0006616115570068
第二種:包給函式-外包
import time
def outer(func):
start_time = time.time()
res = func()
end_time = time.time()
print(end_time - start_time)
def index():
print('睡一秒')
time.sleep(1)
index = outer(index)
index()
睡一秒
1.0004618167877197
import time
def outer(func):
start_time = time.time()
res = func()
end_time = time.time()
print(end_time - start_time)
return res
def index():
print('睡一秒')
time.sleep(1)
return '我有返回值'
index = outer(index)
res = index()
print(res)
睡一秒
1.000257968902588
我有返回值
import time
def outer(func):
start_time = time.time()
res = func(*args,**kwargs)
end_time = time.time()
print(end_time - start_time)
return res
def index(x):
print('睡一秒')
time.sleep(1)
return f"傳入值為:"
index = outer(index)
res = index(5)
print(res)
睡一秒
1.0001804828643799
傳入值為:5
import time
def outer(func):
start_time = time.time()
res = func(*args,**kwargs)
end_time = time.time()
print(end_time - start_time)
return res
@outer # index = outer(index)
def index(x):
print('睡一秒')
time.sleep(1)
return f"傳入值為:"
res = index(5)
print(res)
睡一秒
1.0002069473266602
傳入值為:5
def deco(func):
res = func(*args,**kwargs)
return res
@deco
def f1():
pass
函式裝飾器和閉包
裝飾器是可呼叫的物件,其引數是另乙個函式 被裝飾的函式 裝飾器可能會處理被裝飾的函式,然後把它返回,或者將其替換成另乙個函式或可呼叫物件。裝飾器通常把函式替換成另乙個函式 defdeco func definner print running inner return inner deco def ...
閉包函式和裝飾器
目錄 二 閉包函式的應用 裝飾器閉包 閉是封閉 函式內部巢狀函式 包是包含,閉包是指該內部函式對外部作用域而非全域性作用域的變數的引用。為函式傳參的方式一 使用引數的形式def func x print x func 1 為函式傳參的方式二 包給函式def outter x x 2 def inne...
閉包函式和裝飾器
閉包函式 作用域關係在函式定義階段時就已經固定死了,與呼叫位置無關 即 在任意位置呼叫函式都需要跑到定義函式時尋找作用域關係 def f1 x 1 def inner print x x最後還是等於1,因為只看定義階段,return inner func f1 def f2 x 111111 fun...