python閉包

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

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

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

print('*'*15)

結果如下:


函數的引用.jpg

那閉包是如何在函數內引用函數的?看如下代碼:

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))

結果如下:


閉包.jpg

接下來看一個閉包的實際例子,定義一個函數曲線,給定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))

結果如下:


閉包實例.jpg

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

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