1.什么是閉包?
閉包(closure)是函數(shù)式編程的重要的語(yǔ)法結(jié)構(gòu)与境。
? ? ? ?在程序的編寫(xiě)過(guò)程中验夯,我們沒(méi)有太多心思去顧慮各個(gè)變量是否沖突,所以有了閉包的方法摔刁。我個(gè)人理解閉包就是把原本要在全局聲明的變量變成局部聲明變量挥转,這樣在每個(gè)函數(shù)中我們可以聲明和其他函數(shù)中名稱相同的變量,當(dāng)然在Python中普通函數(shù)也可以共屈。
? ? ? ?而兩者的區(qū)別是:閉包函數(shù)的返回值和變量在函數(shù)調(diào)用過(guò)后不會(huì)釋放掉绑谣,而普通函數(shù)就會(huì)釋放掉,我們還可以在后續(xù)程序中隨時(shí)調(diào)用和操作該函數(shù)的返回值拗引。而且我們?cè)诤瘮?shù)內(nèi)部聲明的局部變量可以當(dāng)作全局變量在函數(shù)外部進(jìn)行操作和訪問(wèn)借宵。
2.閉包有什么作用?
閉包可以用在許多地方寺擂。它的最大用處有兩個(gè)暇务,一個(gè)是可以讀取函數(shù)內(nèi)部的變量,另一個(gè)就是讓這些變量的值始終保持在內(nèi)存中怔软,不會(huì)在調(diào)用后被自動(dòng)清除垦细。
3.閉包的寫(xiě)法.
局部變量當(dāng)作全局變量的體現(xiàn):
拿一段程序來(lái)說(shuō)
def outer(a,b):
? ? ? def inner(c):
? ? ? ? ? ? ?return a*c+b
? ? ? return inner
outer1 = outer(2,3)
outer2 = outer(10,20)
print(outer1(5), outer2(10))
此時(shí)輸出的結(jié)果為13和120
可見(jiàn)在調(diào)用函數(shù)時(shí),我們?cè)诤瘮?shù)外部操作了outer函數(shù)內(nèi)部的變量挡逼,此時(shí)該變量是以全局變量的形式存在的括改。
避免變量名稱沖突的體現(xiàn):
如下程序:
def outer():
? ? ? a = []
? ? ? def inner(msg):
? ? ? ? ? ? a.append(msg)
? ? ? ? ? ? print(a)
? ? ? return inner
def outer1():
? ? ? a = []
? ? ? def inner1(msg):
? ? ? ? ? ? a.append(msg)
? ? ? ? ? ? return a
? ? ? return inner1
a= outer()
a("人面桃花相映紅")
a= outer1()
print(a("為伊消得人憔悴"))
在上述程序中,雖然程序末尾調(diào)用函數(shù)時(shí)家坎,兩個(gè)不同的函數(shù)把返回值都賦給了相同的變量a嘱能,但是在閉包函數(shù)中,這兩個(gè)a是不沖突的虱疏,后來(lái)的a并不會(huì)像普通函數(shù)一樣覆蓋上面程序中的變量a惹骂,所以輸出結(jié)果為 ? ?['人面桃花相映紅'],['為伊消得人憔悴']