python閉包函式

2021-08-18 14:49:44 字數 1467 閱讀 7840

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定義的函式可以引用其外圍空間中的變數,這些外圍空間中被引用的變數叫做這個函式的環境變數。環境變數和這個非全域性...