python函式閉包(closure)比較抽象,在函式式程式設計中運用地比較多,通俗點就是子函式(內嵌函式)呼叫上層函式(閉包函式)的變數,且上層函式(閉包函式)接收的變數會儲存在子函式(內嵌函式)的變數中可以供子函式(內嵌函式)呼叫
概念很抽象,但是實現的例子還是比較容易理解的,這裡記住實現函式閉包的三大要點:
1.閉包函式必須有內嵌函式
2.內嵌函式需要引用該巢狀函式上一級namespace中的變數
3.閉包函式必須返回內嵌函式
看下面的例子:
def
closure_func
(args1):
defgreeting
(arg2):
print(args1, arg2)
return greeting
f1 = closure_func("引數1")
f1("引數2")
print(dir(f1))
print(f1.__closure__)
print(type(f1.__closure__[0]))
print(f1.__closure__[0].cell_contents)
列印結果如下:
引數1 引數2
['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
(0x000002801f0375e8: str object
at 0x000002801f031ce8>,)
引數1
是的,通過閉包函式獲取的引數在內嵌函式中得到了永生~,這就是閉包,其實呼叫的是closure屬性,將變數以元組儲存在了closure.contents中
所以還是那三個重要的原則:
1.閉包函式必須有內嵌函式
2.內嵌函式需要引用該巢狀函式上一級namespace中的變數
3.閉包函式必須返回內嵌函式
對了,有沒有發現這個呼叫方式和裝飾器很像?
python閉包函式
python是一種物件導向的程式語言,在python中一切皆物件,這樣就使得變數所擁有的屬性,函式也同樣擁有。這樣我們就可以理解在函式內建立乙個函式的行為是完全合法的。這種函式被叫做內嵌函式,這種函式只可以在外部函式的作用域內被正常呼叫,在外部函式的作用域之外呼叫會報錯。而如果內部函式裡引用了外部函...
python閉包函式
在一些語言中,在函式中可以 巢狀 定義另乙個函式時,如果內部的函式引用了外部的函式的變數,則可能產生閉包。閉包可以用來在乙個函式與一組 私有 變數之間建立關聯關係。在給定函式被多次呼叫的過程中,這些私有變數能夠保持其永續性。維基百科。即在內部函式中引用了外部函式的變數,就是閉包函式。def mult...
Python閉包函式
toc python的閉包函式 如果乙個函式定義a在另乙個函式b的作用域內,並且引用了外層函式b的變數,則該函式稱為閉包。閉包是python所支援的一種特性,它讓在非global scope定義的函式可以引用其外圍空間中的變數,這些外圍空間中被引用的變數叫做這個函式的環境變數。環境變數和這個非全域性...