python閉包和裝飾器

2021-10-07 07:25:10 字數 1522 閱讀 8656

一、閉包

閉包從形式上來說是在外部函式中定義內部函式,並且內部函式引用了外部函式的變數,此變數叫做自由變數。

或者說是將組成函式的語句和這些語句的執行環境打包在一起。

閉包滿足的條件:

def closure():

value =

def fun(tmp):

return value

return fun

cc = closure()

cc(0) #[0] 等同於closure(fun(0))

cc(1) #[0,1]

cc(2) #[0,1,2]

外部函式closure中有變數value和內部函式fun,並且內部函式fun引用了自由變數value,當執行cc = closure()時,就產生了乙個閉包fun,該閉包持有只有變數value,當函式closure生命週期結束後,value依然存在,因為它被閉包引用了。

二、裝飾器

裝飾器其實就是閉包的應用,只不過其傳遞的是函式。

def add_time(fun):

print('time: 12:00')

return fun()

def add_format(fun):

print('\n')

return fun()

@add_format #等同於demo = add_format(add_time(demo))

@add_time #等同於 demo = add_time(demo)

def demo():

return 'hello world!'

另外,裝飾器會將demo函式的元資訊丟失,例如__name__等等。

import functools

def add_time(fun):

@functools.wraps(fun)

print('time: 12:00')

return fun()

def add_format(fun):

@functools.wraps(fun)

print('\n')

return fun()

@add_format #等同於demo = add_format(add_time(demo))

@add_time #等同於 demo = add_time(demo)

def demo():

return 'hello world!'

例如給任意函式加上列印時間的功能的裝飾器:

def metric(fn):

start=time.time()

@functools.wraps(fn)

end=time.time()

print('%s executed in %s ms' % (fn.__name__,start-end))

return fn(*args,**kw)

python裝飾器和閉包

下面幾個部落格有裝飾器的講解,也包含了裝飾器幾種情況的例子,比如說被裝飾的函式帶引數,裝飾器本身帶引數等。理解python中的裝飾器 python裝飾器學習 例子 其實裝飾器跟設計模式中的裝飾器模式基本一樣,就是在已有的函式上新增新的功能,這也是自己對裝飾器的一點簡陋的理解了。下面是自己寫的簡單例子...

python閉包和裝飾器

要理解裝飾器,就要明白閉包 要明白閉包,首先就要從高階函式和作用域說起 說道作用域,一般會談到legb規則。所謂的legb l locals,當前命名空間 區域性作用域 e enclosing,外部函式的命名空間 外部作用域 g global,全域性的命名空間 b bulit in,內建的命名空間平...

python 閉包和裝飾器

閉包的寫法,兩層函式的巢狀,外部函式返回內部函式的引用,外層函式都帶引數 def 外層函式的名稱 引數 def 內層函式的名稱 pass return 內層函式的引用 def set fun func func 254 defcall fun nonlocal func 修改外層函式的值,並且內部函...