標籤:int pre bsp 函數應用 迴圈 ini print code 局部變數
閉包(closure)
當一個函數在內部定義函數,並且內部的函數應用外部函數的參數或者局部變數,當內建函式被當做傳回值的時候,相關參數和變數儲存在返回函數中,這種結果,叫閉包
example1:
1 def test(*args): 2 3 def test_1(): 4 rst = 0 5 for i in args:#這裡使用了函數外部的參數 6 rst += i 7 return rst 8 return test_1#將函數作為傳回值返回,相關參數和變數儲存在返回的函數中 9 10 a = test(1,2,3)11 print(a())
這上面就是一個常見的閉包
閉包也有坑人的地方
example2:
def count(): fs = [] #這裡定義了一個列表 for i in range(1,4): #定義了一個函數f #f是一個閉包的結構 def f(): return i*i#這裡不會馬上計算 要返回的時候才會計算 fs.append(f) return fsf1,f2,f3 = count()print(f1())print(f2())print(f3())# 9# 9# 9# [Finished in 0.2s]# 為什麼會是999呢,造成上述狀況的原因是,返回函數引用了變數i,# 而i並不是立即執行,而是等腰三個函數都返回的時候才統一執行# 此時i已經變成了3,最終調用的時候 返回的都是 3*3#
上述問題得到結果: 返回閉包時,不能引用任何迴圈變數
解決辦法:
再在外面套一個函數
example3:
def count2(): fs = [] #這裡定義了一個列表 def f(i):#將i作為參數傳入進去 def g(): return i*i#這裡i返回的時候會馬上執行 return g for i in range(1,4): fs.append(f(i)) return fsf1,f2,f3 = count2()print(f1())print(f2())print(f3())#1#4#9
python 函數閉包()