這些東西是我在慕課網,廖雪峰大神的python課中學到的。自己寫成筆記的形式分享給大家。
先來看一段代碼:
1 def f1(x): 2 return x*x 3
4 def new_fn(f): 5 def fn(j): 6 print 'print'+f.__name__
7 return f(j) 8 return fn 9
10 g1 = new_fn(f1) 11 print g1(5)
運行結果:
printf1 25
1.為什么會用到閉包?
在不修改f1函數的前提下,輸出f1函數的名稱
2.閉包是個什么鬼?
new_fn()函數傳入一個參數f(f是一個函數),new_fn()中有一個fn()函數,這個就是增加參數功能的地方。
fn()函數可以使用new_fn()函數接收的參數f。
3.實例化的時候g1 其實就是函數fn()(不准確但是好理解),傳入的參數f1就是要增加功能的函數。
這里需要注意的是,g1是一個函數名,加上()就能當作函數來用了。(因為fn返回的是一個函數對象)
總結:
a.閉包就是為了不動原函數里面的代碼,還要給它增加‘性功能’的一種手段。
b.通過外面的一層層的函數傳遞的參數,讓最內層的函數可以直接調用外層函數所有參數,從而實現不動原函數的代碼,增加新功能的辦法。
最后,在python中,修飾器就是最好的體現:
看一段代碼:
實現輸出傳入參數運行了多長時間,並輸出,時間單位是傳入的參數。
import time def performance(unit): def performance_decorator(f): def p(x): t1 = time.time() r = f(x) t2 = time.time() print 'call %s() in %f %s' % (f.__name__, t2 - t1, unit) return r return p return performance_decorator @performance('ms') def factorial(n): return reduce(lambda x,y: x*y, range(1, n+1)) print factorial(10)