Machen Sie sich mit Python-Verschlüssen von Grund auf vertraut

Was ist eine Schließung? Was nützen Verschlüsse? Warum Verschlüsse verwenden? Heute werden wir diese 3 Fragen beantworten, um die Schließungen Schritt für Schritt zu verstehen.

Abschlüsse und Funktionen sind eng miteinander verbunden. Vor dem Einführen von Abschlüssen müssen Hintergrundwissen eingeführt werden, z. B. das Konzept verschachtelter Funktionen und der Umfang der Variablen.

Umfang

Der Bereich ist der Bereich, auf den bei Ausführung des Programms zugegriffen werden kann. Die in der Funktion definierte Variable ist eine lokale Variable. Der Bereich der lokalen Variablen kann nur innerhalb des Bereichs der Funktion liegen und außerhalb der Funktion nicht referenziert werden.

Die in der äußersten Schicht des Moduls definierten Variablen sind globale Variablen, die im globalen Bereich sichtbar sind. Natürlich können auch globale Variablen in der Funktion gelesen werden.

Z.B:

num = 10 # 全局作用域变量
def foo():
    print(num)  # 10

Auf lokale Variablen kann außerhalb der Funktion nicht zugegriffen werden.
Z.B:

def foo():
    num = 10
print(num)  # NameError: name 'num' is not defined

Verschachtelte Funktion

Eine Funktion kann nicht nur in der äußersten Schicht eines Moduls, sondern auch in einer anderen Funktion definiert werden. Eine in einer Funktion definierte Funktion wird als verschachtelte Funktion bezeichnet. Beispiel:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def print_msg():
    # print_msg 是外围函数
    msg = "zen of python"

    def printer():
        # printer是嵌套函数
        print(msg)
    printer()
# 输出 zen of python
print_msg()

Für verschachtelte Funktionen kann auf nicht lokale Variablen zugegriffen werden, die in ihrem äußeren Bereich deklariert sind. Beispielsweise kann der Drucker für verschachtelte Funktionen normalerweise auf die Variable msg im Codebeispiel zugreifen.

Gibt es also eine Möglichkeit, dass auf lokale Variablen auch außerhalb des Funktionsumfangs selbst zugegriffen werden kann? Die Antwort ist Schließung

Was ist eine Schließung?

Als erstklassiges Objekt kann eine Funktion als Rückgabewert einer Funktion zurückgegeben werden. Betrachten wir nun das folgende Beispiel:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def print_msg():
    # print_msg 是外围函数
    msg = "zen of python"
    def printer():
        # printer 是嵌套函数
        print(msg)
    return printer

another = print_msg()
# 输出 zen of python
another()

Dieser Code hat genau den gleichen Effekt wie das vorherige Beispiel und gibt auch "Zen of Python" aus. Der Unterschied besteht darin, dass der interne Funktionsdrucker direkt als Rückgabewert zurückgibt.

Im Allgemeinen sind lokale Variablen in einer Funktion nur während der Ausführung der Funktion verfügbar. Sobald print_msg () ausgeführt wird, denken wir, dass die msg-Variable nicht mehr verfügbar ist. Hier stellen wir jedoch fest, dass nach der Ausführung von print_msg der Wert der Variablen msg normalerweise ausgegeben wird, wenn eine andere aufgerufen wird. Dies ist die Funktion des Abschlusses, die den Zugriff auf lokale Variablen außerhalb der Funktion ermöglicht.

Nachdem Sie dieses Beispiel gelesen haben, definieren wir den Abschluss erneut. Die Erklärung auf Wikipedia lautet:

In der Informatik ist Closure die Abkürzung für Lexical Closure, eine Funktion, die auf freie Variablen verweist. Die referenzierte freie Variable ist mit dieser Funktion auch dann vorhanden, wenn sie die Umgebung verlassen hat, in der sie erstellt wurde. Daher gibt es eine andere Ansicht, dass ein Abschluss eine Entität ist, die aus einer Funktion und der zugehörigen Referenzumgebung besteht.

Hier ist ein anderer ein Verschluss. Ein Verschluss ist im Wesentlichen eine Funktion. Er besteht aus zwei Teilen, der Druckerfunktion und der Variablen msg. Closures behalten die Werte dieser Variablen jederzeit im Speicher.

Ein Abschluss ist, wie der Name schon sagt, ein geschlossenes Paket, das genau wie die in einer Klasse definierten Attributwerte mit freien Variablen umbrochen wird. Der sichtbare Bereich freier Variablen wird vom Paket begleitet. Wenn Sie auf dieses Paket zugreifen können, können Sie auf diese Freiheit zugreifen. Variable.

Warum Verschlüsse verwenden

Schließungen vermeiden die Verwendung globaler Variablen. Darüber hinaus ermöglichen Schließungen die Zuordnung von Funktionen zu bestimmten Daten (Umgebungen), mit denen sie arbeiten. Dies ist der objektorientierten Programmierung sehr ähnlich. Bei der objektorientierten Programmierung können wir mit Objekten bestimmte Daten (Objekteigenschaften) einer oder mehreren Methoden zuordnen.

Im Allgemeinen ist es besser, Verschlüsse zu verwenden, wenn das Objekt nur eine Methode enthält.
Schauen wir uns ein Beispiel an:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def adder(x):
    def wrapper(y):
        return x + y
    return wrapper

adder5 = adder(5)
# 输出 15
adder5(10)
# 输出 11
adder5(6)

Dies ist eleganter als die Verwendung von Klassen. Darüber hinaus sind Dekorateure auch ein Anwendungsszenario, das auf Schließungen basiert.

Alle Funktionen haben ein __closure__Attribut. Wenn die Funktion ein Abschluss ist, gibt sie ein Tupelobjekt zurück, das aus Zellenobjekten besteht. Die cell_contentsEigenschaften des Zellenobjekts sind die freien Variablen im Abschluss.

>>> adder.__closure__
>>> adder5.__closure__
(<cell at 0x103075910: int object at 0x7fd251604518>,)
>>> adder5.__closure__[0].cell_contents
5

Dies erklärt, warum nach dem Verlassen der Funktion für lokale Variablen auch außerhalb der Funktion zugegriffen werden kann, da diese im Abschluss cell_contentsin der gespeichert ist .

Ich denke du magst

Origin blog.csdn.net/sinat_38682860/article/details/109311643
Empfohlen
Rangfolge