淺談一下Python中閉包的作用
一、前言
在函數(shù)內(nèi)部定義的函數(shù)和外部定義的函數(shù)是一樣的,只是他們無法被外部訪問:
def g():
print 'g()...'
def f():
print 'f()...'
return g將 g 的定義移入函數(shù) f 內(nèi)部,防止其他代碼調(diào)用 g:
def f():
print 'f()...'
def g():
print 'g()...'
return g但是,考察定義的 calc_sum 函數(shù):
def calc_sum(lst):
def lazy_sum():
return sum(lst)
return lazy_sum注意: 發(fā)現(xiàn)沒法把 lazy_sum 移到 calc_sum 的外部,因為它引用了 calc_sum 的參數(shù) lst。
像這種內(nèi)層函數(shù)引用了外層函數(shù)的變量(參數(shù)也算變量),然后返回內(nèi)層函數(shù)的情況,稱為閉包(Closure)。
二、閉包函數(shù)
閉包特點是返回的函數(shù)還引用了外層函數(shù)的局部變量,所以,要正確使用閉包,就要確保引用的局部變量在函數(shù)返回后不能變。舉例如下:
# 希望一次返回3個函數(shù),分別計算1x1,2x2,3x3:
def count():
fs = [ ]
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs
f1, f2, f3 = count()你可能認為調(diào)用 f1(),f2()和 f3()結(jié)果應(yīng)該是 1,4,9,但實際結(jié)果全部都是 9(請自己動手驗證)。
原因就是當(dāng) count()函數(shù)返回了 3 個函數(shù)時,這 3 個函數(shù)所引用的變量 i 的值已經(jīng)變成了 3。由于 f1、f2、f3 并沒有被調(diào)用,所以,此時他們并未計算 i*i,當(dāng) f1 被調(diào)用時:
f1() 9 # 因為f1現(xiàn)在才計算i*i,但現(xiàn)在i的值已經(jīng)變?yōu)?
因此,返回函數(shù)不要引用任何循環(huán)變量,或者后續(xù)會發(fā)生變化的變量。
返回閉包不能引用循環(huán)變量,請改寫 count()函數(shù),讓它正確返回能計算 1x1、2x2、3x3 的函數(shù)。
考察下面的函數(shù) f:
def f(j):
def g():
return j*j
return g它可以正確地返回一個閉包 g,g 所引用的變量 j 不是循環(huán)變量,因此將正常執(zhí)行。在 count 函數(shù)的循環(huán)內(nèi)部,如果借助 f 函數(shù),就可以避免引用循環(huán)變量 i。
參考代碼:
def count():
fs = []
for i in range(1, 4):
def f(j):
def g():
return j*j
return g
r = f(i)
fs.append(r)
return fs
f1, f2, f3 = count()
print f1(), f2(), f3()三、程序?qū)嵗?/h2>

到此這篇關(guān)于淺談一下Python中閉包的作用的文章就介紹到這了,更多相關(guān)Python閉包內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用matplotlib實現(xiàn)基礎(chǔ)繪圖功能示例
這篇文章主要介紹了Python使用matplotlib實現(xiàn)基礎(chǔ)繪圖功能,結(jié)合實例形式分析了Python基于matplotlib實現(xiàn)正弦、余弦圖形及多軸圖的相關(guān)繪制操作技巧,需要的朋友可以參考下2018-07-07
對Keras中predict()方法和predict_classes()方法的區(qū)別說明
這篇文章主要介紹了對Keras中predict()方法和predict_classes()方法的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
python使用numpy實現(xiàn)直方圖反向投影示例
今天小編就為大家分享一篇python使用numpy實現(xiàn)直方圖反向投影示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
python中format函數(shù)與round函數(shù)的區(qū)別
大家好,本篇文章主要講的是python中format函數(shù)與round函數(shù)的區(qū)別,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2022-01-01
Python開發(fā)教程之os.path的常用操作總結(jié)
這篇文章主要介紹了Python開發(fā)教程之os.path的常用操作,os模塊最常用的功能之一就是文件和目錄操作,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2025-05-05
Python中urlencode()函數(shù)構(gòu)建URL查詢字符串的利器學(xué)習(xí)
這篇文章主要為大家介紹了Python中urlencode()函數(shù)構(gòu)建URL查詢字符串的利器學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10
flask路由分模塊管理及自定義restful響應(yīng)格式詳解
這篇文章主要為大家介紹了flask路由分模塊管理及自定義restful響應(yīng)格式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08

