def
curve_pie
(): a =25
defcurve
(x):
return a*pow(x,2)
return curve
f =curve_pie()
print(f(2))
輸出結果:
ans=100
檢驗函式是否閉包
print(f.__closure__)
#環境變數 a=25
print(f.__closure__[0].cell_contents)
輸出結果
(0x00000191d32a8228: int object at 0x000000005be16f40>,)
25
該函式閉包
*初始的位置(origin=0),一共行走了3步(step),第一步 為2 ,第二步為3 ,第三步為5,求現在為什麼位置(new_pos)?(利用閉包和非閉包的形式求解)
#非閉包形式
orgian = 0
defgo
(step):
global orgian
new_pos = orgian + step
orgian = new_pos
return orgian
print(go(2))
print(go(3))
print(go(5))
結果:
2 5
10
如果這樣寫
defgo
(step):
new_pos = orgian + step
orgian = new_pos
報錯:
unboundlocalerror: local variable 『orgian』 referenced before assignment
原因是:orgian = new_pos 在python中表示了orgian是乙個區域性變數,可是你上一步用的orgin是全域性變數,衝突了,就報錯了。所以必須在orgian前加上global來定義orgian為全域性變數。可是在實際編碼中,如果都用global來定義,不具有封裝性了。不是特別好。
所以利用閉包的形式來編碼,效果比較好。
#閉包形式
orgian = 0
deff1
(pos):
deff2
(step):
nonlocal pos
new_pos = pos +step
pos = new_pos
return new_pos
return f2
f = f1(orgian)
print(f(2))
print(f(3))
print(f(5))
結果:
2 5
10 檢驗是否為閉包形式
f = f1(orgian)
print(f(2))
print(f.__closure__[0].cell_contents)
print(f(3))
print(f.__closure__[0].cell_contents)
print(f(5))
print(f.__closure__[0].cell_contents)
結果:
2 2
5 5
10 10
說明是閉包形式。
def
f2(step):
nonlocal pos
new_pos = pos +step
pos = new_pos
利用nonlocal定義pos,為閉包內的全域性變數
而且最後不改變origin的值。
函式式程式設計與閉包
函式式程式設計 functional programming,fp fp是程式設計正規化之一,他和物件導向程式設計是並列的關係,函式式程式設計我們可以認為是一種思維的方法,加上他的實現方法,我們常聽說的程式設計正規化還有面向過程程式設計 物件導向程式設計。面向過程其實就是現實世界的處理方式,一步一步...
Python函式式程式設計之閉包
def div fun n def div check fun x return x n 0 return div check fun這是什麼?外層函式中巢狀了乙個函式,然後外層函式將內層函式作為返回值進行返回,同時,返回函式中的計算也擁有了外層函式的變數n,這種將外部函式的引數和自身的區域性變數儲...
Scala函式式程式設計(六) 閉包
john d.cook 給物件和閉包 closure 下過乙個經典的定義 anobject is data with functions.a closure is a function with data 1 可以看到,閉包是由函式和執行時的資料決定的,閉包也因此被稱為 lambda 函式。事實上,...