1.初識閉包
閉包全稱是閉包函數,由外函數和內函數構成
閉:指該函數存在內嵌函數,返回值是內嵌函數;
包:外函數將內函數包起來形成一個’包’,內函數這個’包’引用外函數的名稱
閉和包缺一都不能叫閉包函數。
ps: 內嵌函數.__ closure __如果有值,則他和外部函數組成閉包,如果爲None,則不是閉包
閉包函數的基本寫法:
def outer():
x 外部變量x
def inner():
引用外部變量x
xxxx
return inner
示例代碼1:
def func():
x = 1
def a():
print(x)
print(a.__cloure__)
return a
func()
首先a是func內嵌函數,func返回了a,滿足了'閉',其次a引用了他外層作用域(func內部)的變量x,滿足了'包',所以func是閉包函數
結果爲:
示例代碼2:
x = 1
def func():
def a():
print(x)
print(a.__closure__)
return a
func()
首先a是func內嵌函數,func返回了a,滿足了'閉',但是a中並沒有引用func內部的變量,不滿足'包',所以func不是一個閉包函數
結果爲:
2.閉包應用
1.保護局部變量
def outer():
x = 1
pritn(id(x))
def inner():
print(id(x))
return inner
outer()()
結果如下:
我們知道函數調用結束,會將函數內部的變量給釋放掉,但是形成閉包之後,外部函數的變量被內嵌函數引用了,所以外部函數所處的名稱空間不會被釋放掉,而是繼續存在內存中,這樣就可以保護變量,常駐內存。
2.給函數體傳參
一般給函數體傳參需要給函數加形參,但是使用閉包可以在不給函數添加形參的情況下使用參數:
def func(x,y):
print(x,y)
func(1,2) 結果是:1,2
def outer(x,y):
def func():
print(x,y)
return func
func = outer(1,2)
func() 結果是1,2
3.裝飾器(以後文章會講)
這是閉包最經典的應用。