python閉包

在函數(shù)內(nèi)部再定義一個(gè)函數(shù),并且這個(gè)函數(shù)用到了外邊函數(shù)的變量,那么將這個(gè)函數(shù)以及用到的一些變量稱之為閉包。在了解閉包之前,先了解一下函數(shù)的引用。

def test():
    print('...test...')

test()
t1 = test
t1()
print(id(test))
print(id(t1))

print('*'*15)

結(jié)果如下:


函數(shù)的引用.jpg

那閉包是如何在函數(shù)內(nèi)引用函數(shù)的?看如下代碼:

def test(number):
    def test_in(number_in):
        print('test_in的number_in是:%s'%number_in)
        return number+number_in
    return test_in


t1 = test(10)
print(t1(20))
print(t1(30))

結(jié)果如下:


閉包.jpg

接下來看一個(gè)閉包的實(shí)際例子,定義一個(gè)函數(shù)曲線,給定x的值求y的值。

def fun1(k,b):
    def fun1_in(x):
        print('x的值是:%s'%x)
        return k*x+b
    return fun1_in

f1 = fun1(2,1)
print(f1(3))

結(jié)果如下:


閉包實(shí)例.jpg

這個(gè)例子中,函數(shù)fun1與變量k,b構(gòu)成閉包。在創(chuàng)建閉包的時(shí)候,我們通過fun1的參數(shù)k,b說明了這兩個(gè)變量的取值,這樣,我們就確定了函數(shù)的最終形式(y=kx+b)。我們只需要變換參數(shù)a,b,就可以獲得不同的直線表達(dá)函數(shù)。由此,我們可以看到,閉包也具有提高代碼可復(fù)用性的作用。
如果沒有閉包,我們需要每次創(chuàng)建直線函數(shù)的時(shí)候同時(shí)說明k,b,x。這樣,我們就需要更多的參數(shù)傳遞,也減少了代碼的可移植性。
閉包似優(yōu)化了變量,原來需要類對象完成的工作,閉包也可以完成。
但由于閉包引用了外部函數(shù)的局部變量,則外部函數(shù)的局部變量沒有及時(shí)釋放,消耗內(nèi)存。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、python函數(shù)作用域LEGB python解釋器查找變量的原則(順序):L→E→G→BL:Local函數(shù)內(nèi)部...
    風(fēng)蕭雨霖閱讀 534評論 0 0
  • 閉包的概念 關(guān)于什么是閉包,下面是百度百科的解釋 閉包是可以包含自由(未綁定到特定對象)變量的代碼塊;這些變量不是...
    Ljian1992閱讀 843評論 3 7
  • 閉包(closure)是函數(shù)式編程的重要的語法結(jié)構(gòu)。函數(shù)式編程是一種編程范式 (而面向過程編程和面向?qū)ο缶幊桃捕际?..
    Mr_Chen閱讀 345評論 0 1
  • 我在博客中曾經(jīng)介紹過兩篇關(guān)于函數(shù)的文章,第一篇是 關(guān)于 Python 函數(shù)是第一類對象,第二篇是關(guān)于 Lambda...
    liuzhijun閱讀 1,604評論 2 27
  • 秋天,樹葉會(huì)落下來 離開也是重生 度過一個(gè)寒冷的冬天 雨后芳華依然 人有悲歡,物有感念 月有盈缺,影有明暗 東邊日...
    春風(fēng)明月閱讀 491評論 3 1

友情鏈接更多精彩內(nèi)容