python進階系列學習(三)
阿新 • • 發佈:2019-01-08
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的結果,必須讓記憶體函式的變數不隨著外層函式變化而變化,或者直接就在內層函式中先計算出來,用一個變數儲存~