python用例項學習閉包和自由變數

2021-10-05 07:16:54 字數 1994 閱讀 5121

引用自由變數的鑲嵌函式才是閉包

python 的函式有乙個唯讀屬性 __closure__,儲存的就是函式所引用的自由變數,僅是巢狀函式,它的 __closure__ 應該是 none# 一.閉包的執行過程def test1(number):

# 執行1

print("ok")

# 執行4

def test2(a):

number = 5

print(a,number)

number = 6

print(number)

# 執行2

print(number)

# 執行3,匯出內部方法,不寫訪問不了,相當於入口

return test2

# test1(4)代表訪問test1這個函式輸入引數4,他會返回乙個test2方法,加(7)就進入test2方法

# a = test1(4)(7)

# 返回

# ok

# 4# 7 5

# 6# 二.閉包的注意事項:# 1.內部函式只能讀取自由變數值,無法修改自由變數值,且如果內部對自由變數先列印後賦值,由於python命名空間規則,會認定這個變數是區域性變數,從而報錯

# 2.自由變數在函式外部無法使用,會報錯

# print(number) nameerror: name 'number' is not defined

# 3.由於函式命名空間查詢規則,自由變數先於全域性變數被找到,因此在函式外部改自由變數時,不起效果,只是相當於建立全域性變數

# 4.自由變數容易出現的問題:任何方法在呼叫前都只是載入不會執行這個情況後即函式在沒有執行前,內部**不執行

(裡面涉及pyhon函式作用域問題,我看了這位大佬寫的,感覺get了許多知識)

# 4對應:對應例項

fs = [lambda j:i*j for i in range(6)]

print(fs[0](2))

# 以上等價於

for i in range(6):

j = 2

# test只被宣告,未被呼叫

def test():

global j

j = i*j

print(j)

# 如果此處加test(),能正常產生結果,因為每次i改值都被呼叫函式

# 此時呼叫i已經指向5

test()

# 10 10# 三.內部函式更改自由變數# 1.在外部函式內將自由變數放入可變資料型別裡,此時更改不會對自由變數造成影響

# 2.在內部函式裡使用關鍵字nonlocal 形式 nonlocal 自由變數 (理解:non + local 告訴直譯器不是區域性變數)

# 例項:使用可變資料型別

def f1(a):

a = [a]

print(a)

print(1)

def f2(b):

b = a[0]

print(2)

print(b)

print(3)

return f2

b = f1('a')('b')

def f1(a):

a =

print(a)

print(1)

def f2(b):

b = a[1]

print(2)

print(b)

print(3)

return f2

b = f1('a')('b')# 例項:使用關鍵字def f1(a):

print(a)

print(1)

def f2(b):

nonlocal a

b = a

print(2)

print(b)

print(3)

return f2

b = f1('a')('b')

python閉包詳解 例項演示

python閉包詳解 例項演示 閉包 這個詞語相信大多數學過程式設計的同學並不陌生,但是有時候理解起來還是有一定難度。先看定義 閉包是由函式和與其相關的引用環境組合而成的實體。比如參考資源中就有這樣的的定義 在實現深約束時,需要建立乙個能顯式表示引用環境的東西,並將它與相關的子程式 在一起,這樣 起...

python閉包的例項詳解

1 在外部函式中定義內部函式,內部函式包含訪問外部函式。即使外部函式的生命週期結束後,內部函式仍然可以訪問外部函式變數。2 外部函式的返回值是內部函式本身。def outer cheer hello def inner name return cheer name return inner if n...

Python 閉包和裝飾器學習

def out func func functools.wraps 可以將原函式物件的指定屬性複製個包裝函式物件 functools.wraps func def inner func func,args,kwargs return func return inner func out func d...