1. 程式人生 > 其它 >2022.04.14-python學習之函式的閉包

2022.04.14-python學習之函式的閉包

 1 # File : learning_011_closures.py
 2 # Datetime : 2022/4/14 1:22
 3 
 4 
 5 # 閉包
 6 # 一般情況下,如果一個函式結束,函式的內部所有東西都會釋放掉,區域性變數都會消失。
 7 # 但是閉包是一種特殊情況,如果外函式在結束的時候發現有自己的臨時變數將來會在內部函式中用到,就把這個臨時變數繫結給了內部函式,然後自己再結束。
 8 
 9 # 1. 函式的閉包
10 # 在python中,一個函式內部再定義一個其他函式,將外部函式作為其巢狀內部函式的引用環境,
11 # 並且在內部函式處理期間外部函式的引用環境一致都會保持不變,
12 # 這種將內部函式與外部函式作為整體處理的函式巢狀結構在程式設計中稱為閉包. 13 # 程式碼示例: 14 def outer(a): # 定義外部函式 15 print("a = %d" % a) 16 17 def inner(b): # 定義內部函式 18 print("b = %d" % b) 19 return a + b # a為外部函式的引數,與內部函式的引數b相加 20 21 return inner # 返回內部函式物件 22 23 24 result = outer(10) # 接收外部函式物件 25
print(result(11)) # result(11)執行內部函式inner() 26 27 28 # 在outer函式內部嵌套了inner函式,inner函式可以使用外部函式outer中傳入的引數, 29 # 在獲取內部函式時,首先通過外部函式返回了內部函式的引用給物件result, 30 # 這樣result就代表了inner內部函式,當result()執行函式時會繼續使用外部函式outer中的變數a執行加法計算 31 32 # 總結: 33 # 在一個外部函式中定義了一個內部函式, 34 # 內部函式裡運用了外部函式的臨時變數, 35 # 並且外部函式的返回值是內部函式的引用。這樣就構成了一個閉包。
36 37 38 # 閉包的最大特點: 39 # 是可保持外部函式操作的狀態, 40 # 但是 如果要想在 內部函式中 修改 外部函式中定義的區域性變數或者引數的內容,則必須使用nonlocal關鍵字 41 42 # 程式碼示例: 43 44 def print_count(login_count): # 外部函式 45 def login(login_name): # 內部函式 46 nonlocal login_count # 修改外部函式變數 使用nonlocal函式 47 login_count += 1 # 修改外部函式變數 48 return "第 %d 次登入資訊: %s" % (login_count, login_name) 49 50 return login # 返回內部函式物件 51 52 53 login_info = print_count(0) # 接收外部函式物件,從0開始計數 54 print(login_info("張三")) # 呼叫內部函式 55 print(login_info("李四")) 56 print(login_info("王五"))