1. 程式人生 > >python進階系列學習(三)

python進階系列學習(三)

python中的閉包

回顧上一節返回函式:

#python中的閉包
def f():
    print("我是f()函式")
    def g():
        print("我是g()函式,是被f()函式呼叫的")
    return g  #f()函式返回的就是函式

if __name__=="__main__":
    g=f()
    print('*'*30)
    g()

其實這裡的g()可以放在f()函式的外面,沒必要非得放裡面:

def g():
    print("我是函式g(),一會f()函式可能要呼叫我")
def f():
    print("我是函式f(),我一會要呼叫g()"
) return g #返回的是函式 if __name__=="__main__": g_1=f() g_1()

然而閉包跟一個函式在另一個函式裡面差不多,除此之外,還需要放在裡面的那個函式需要用到外層函式的引數:

def f():
    fs=[]  #儲存函式g
    for i in range(1,4):
        def g():
            return i*i
        fs.append(g)
    return fs

if __name__=="__main__":
    f1,f2,f3=f()
    print(f1(),f2(),f3())

比如這裡內層函式g() 就用到了外層函式f()中的引數變數i,只不過這裡的i是一直變化的,最終呼叫f1(),f2(),f3()時的i已經變為3了,所以最終的結果都是9

題目:
返回閉包不能引用迴圈變數,請改寫count()函式,讓它正確返回能計算1x1、2x2、3x3的函式。

啊這一題我沒做上來,,,

看了一下答案:

def count():
    fs = []
    for i in range(1, 4):

        j=i*i

        def f(j):
            def g():
                return j
            return
g fs.append(f(j)) return fs f1, f2, f3 = count() print f1(), f2(), f3()

其實閉包就是內層函式引用了外層函式的變數嘛,所以如果想輸出1,4,9的結果,必須讓記憶體函式的變數不隨著外層函式變化而變化,或者直接就在內層函式中先計算出來,用一個變數儲存~