閉包函式和裝飾器

2022-08-22 10:30:15 字數 3199 閱讀 9296

目錄裝飾器

閉包即函式內部函式對外部作用域而非全域性作用域的引用,說白了就是將函式內部的變數拿到全域性來使用,還不會修改區域性變數的值

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...