[python]閉包到底是什么鬼?


這些東西是我在慕課網,廖雪峰大神的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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM