一、閉包
閉包從形式上來說是在外部函式中定義內部函式,並且內部函式引用了外部函式的變數,此變數叫做自由變數。
或者說是將組成函式的語句和這些語句的執行環境打包在一起。
閉包滿足的條件:
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 functoolsdef 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 修改外層函式的值,並且內部函...