什麼是閉包?

不喜歡多做文字解釋,看代碼,能懂就懂,學會百度是必備技能之一
  • 函數的嵌套

  • 內部函數引用外部函數變量 內部函數必須引用一個定義在閉合範圍內的變量

  • 必須返回那個內部函數 外部函數必須返回內部函數的引用

  • 保存內部函數的變量

形成閉包之後,閉包函數會獲得一個非空的__closure__ 屬性,這個屬性非常的特別,它可以保存函數內部的變量,不會被外部修改,從而保證了數據的安全性


def fun():
    x = 5
    def interior():
        nonlocal x
        x += 1
        return x
    return interior


a = fun_out()

a()  # 調用a

這是一個簡單的閉包,怎麼才能通過程序來知道它和普通的函數有什麼區別呢


可以通過使用Python內建的 __closure__ 方法來測試

a.__closure__
 (<cell at 0x000001B6333AAFA8: int object at 0x00000000516461E0>,)

如果是一個普通函數呢

In [39]: def a():
    ...:     print("1")

In [40]: a
Out[40]: <function __main__.a>

In [41]: a()
1

In [42]: a.__closure__

In [43]: type(a.__closure__)
Out[43]: NoneType  # 這是一個空類型


閉包可以確保變量安全性


普通函數的寫法

_list = []

for i in range(3):
	def func(a):
		return i + a
	
	_list.append(func)
	
for f in _list:
	print(f(1))
	
# 這是一個普通函數,執行結果是3,3,3

原因在於:Python中循環體內定義函數,在循環執行過程當中無法保存不停改變的變量


接下來我們用閉包來實現一下看一下結果

_list = []  # 定義一個list

for i in range(3):
     def func_out(a):
         def func_in(z):
             return a + z
         return func_in
     _list.append(func_out(i))  # for循環持續往列表中添加並且調用func_out
     
for f in _list:
	print(f(1))  # for循環持續往列表中添加並且調用func_in



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章