def calc_sum(*args): #可變引數
def inner_sum():
ix = 0 #區域性變數,暫存累加結果
for y in args: #args是calc_sum這個外部函式的變數, 被內部函式inner_sum使用了,故args為自由變數
ix += y
return ix
return inner_sum
f = calc_sum(1,2,3,4,5) #此時僅僅返回了inner_sum(), 但並沒有激發inner_sum()
print(f,'\n')
res = f() #呼叫才激發,懶惰函式
print(res, '\n')
f1 = calc_sum(1,2,3,4,5)
f2 = calc_sum(1,2,3,4,5)
print(f1==f2,'\n')
3. 注意:因為外部函式返回乙個內部函式時,該內部函式並未執行。所以內部函式中不要引用任何可能會變化的變數。#比如,下面「詭異的異常結果」
def count():
fs =
for i in range(1,4): #[1,4)
def f():
return i*i
return fs
f1,f2,f3 = count()
print(f1(), f2(),f3(), '\n') #i最終為3,結果三個f()激發的時候都是3*3
#4.防止發生上述的錯誤,加一層g,並把g(i)繫結for迴圈的i
def count_2():
def g(i): #g是外部函式,不能存在延遲激發
def f(): #f是內部函式,會被延遲激發
return i*i
return f #此時返回f,f為閉包
fs =
for i in range(1,4):
return fs #fs壓入3個g,相比cout_2而言,g是閉包,g在count_2()時還不會激發
g1,g2,g3 = count_2()
print(g1,'\n',g2,'\n',g3,'\n')
print(g1(), g2(), g3(), '\n') #此刻g被激發執行,帶動f被激發執行
def f(): #f僅僅用來產生遞增資料流,可移動至createcounter外部,也可以移進去
n = 1
while true:
yield n
n += 1
def createcounter():
it = f() #立刻呼叫f這個generator,f已經產生了所有的遞增序列it
def counter(): #通過counter每次返回it的乙個項
return next(it) #每次呼叫只返回it中的乙個元素,故而next
return counter #把counter返回出去
counta = createcounter() #返回乙個counter,但counter沒有被激發
print(counta,'\n')
for i in range(5): #5次呼叫counta,即每次都激發一下counter,而激發counter的結果就是:next(it),即取乙個數
print(counta())
python高階之閉包
在函式巢狀的情況下,內部函式使用了外部函式的變數,並且外部函式返回了內部函式,我們就把這個使用了外部函式變數的內部函式稱為閉包。儲存外部函式內的變數,不會隨著外部函式呼叫而銷毀 def out func out num 10 def in func x print f 內部函式使用了外部函式的變數o...
js高階之閉包
1.首先說下什麼是閉包,閉 封閉,包 就像我們的包包 雖然我在扯淡但是也有其道理咯,閉包就有點像j a裡面的封裝一樣,包屬性和方法都封裝到物件內部,在外部通過共有的get set方法獲取或者設定其值,但是js中不是這樣的,在js中是通過閉包的方式來實現的,閉包及在方法外部操作內部私有屬性和方法的方法...
Python高階特性之閉包與裝飾器例項詳解
閉包 1.函式引數 1 函式名存放的是函式的位址 2 函式名 存放的是函式內的 3 函式名只是函式 空間的引用,當函式名賦值給乙個物件的時候,就是引用傳遞 def func01 print func01 is show test func01 print func01 print test test...