30 高階特性之閉包(2)

2022-05-12 06:13:39 字數 1801 閱讀 1650

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...