函式式程式設計 閉包

2021-08-26 17:58:13 字數 2033 閱讀 7582

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 函式。事實上,...