最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談一下Python中閉包的作用

 更新時間:2023年12月26日 08:55:59   作者:wrr-cat  
這篇文章主要介紹了淺談一下Python中閉包的作用,閉包特點是返回的函數還引用了外層函數的局部變量,所以,要正確使用閉包,就要確保引用的局部變量在函數返回后不能變,需要的朋友可以參考下

一、前言

在函數內部定義的函數和外部定義的函數是一樣的,只是他們無法被外部訪問:

def g():
    print 'g()...'
def f():
    print 'f()...'
    return g

將 g 的定義移入函數 f 內部,防止其他代碼調用 g:

def f():
    print 'f()...'
    def g():
        print 'g()...'
    return g

但是,考察定義的 calc_sum 函數:

def calc_sum(lst):
    def lazy_sum():
        return sum(lst)
    return lazy_sum

注意: 發(fā)現沒法把 lazy_sum 移到 calc_sum 的外部,因為它引用了 calc_sum 的參數 lst。

像這種內層函數引用了外層函數的變量(參數也算變量),然后返回內層函數的情況,稱為閉包(Closure)。

二、閉包函數

閉包特點是返回的函數還引用了外層函數的局部變量,所以,要正確使用閉包,就要確保引用的局部變量在函數返回后不能變。舉例如下:

# 希望一次返回3個函數,分別計算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()

你可能認為調用 f1(),f2()和 f3()結果應該是 1,4,9,但實際結果全部都是 9(請自己動手驗證)。

原因就是當 count()函數返回了 3 個函數時,這 3 個函數所引用的變量 i 的值已經變成了 3。由于 f1、f2、f3 并沒有被調用,所以,此時他們并未計算 i*i,當 f1 被調用時:

f1()
9     # 因為f1現在才計算i*i,但現在i的值已經變?yōu)?

因此,返回函數不要引用任何循環(huán)變量,或者后續(xù)會發(fā)生變化的變量。

返回閉包不能引用循環(huán)變量,請改寫 count()函數,讓它正確返回能計算 1x1、2x2、3x3 的函數。

考察下面的函數 f:

def f(j):
    def g():
        return j*j
    return g

它可以正確地返回一個閉包 g,g 所引用的變量 j 不是循環(huán)變量,因此將正常執(zhí)行。在 count 函數的循環(huán)內部,如果借助 f 函數,就可以避免引用循環(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()

三、程序實例

到此這篇關于淺談一下Python中閉包的作用的文章就介紹到這了,更多相關Python閉包內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

南昌县| 沅江市| 河间市| 涡阳县| 濮阳县| 永川市| 荣成市| 金溪县| 凤山县| 渝北区| 金沙县| 华宁县| 黄山市| 西宁市| 连城县| 泰来县| 遵化市| 呼玛县| 林周县| 磴口县| 泰顺县| 景谷| 佳木斯市| 北安市| 无锡市| 中山市| 汉沽区| 休宁县| 孟连| 楚雄市| 林西县| 温宿县| 鄯善县| 调兵山市| 互助| 会东县| 赤壁市| 蒲江县| 福清市| 雷山县| 济源市|