Abschluss (Closure) ist in der Informatik die Abkürzung für lexikalischen Abschluss (Lexical Closure), eine Funktion, die sich auf freie Variablen bezieht. Die referenzierte freie Variable verbleibt bei der Funktion, auch nachdem sie die Umgebung, in der sie erstellt wurde, verlassen hat. Daher kann man auch anders sagen, dass ein Abschluss eine Entität ist, die aus einer Funktion und der zugehörigen Referenzumgebung besteht. Abschlüsse können zur Laufzeit mehrere Instanzen haben, und unterschiedliche Referenzumgebungen und dieselbe Funktionskombination können unterschiedliche Instanzen erzeugen.
Ich bevorzuge Letzteres und betrachte den Abschluss als eine Struktur zum Organisieren von Code, aus Gründen, die ich später erläutern werde.
Wie ist der Schließungscode aufgebaut?
In Python ist alles ein Objekt, was natürlich auch Funktionen beinhaltet. Funktionsobjekte können einer Variablen zugewiesen werden und die Funktion kann über diese Variable aufgerufen werden. Funktionsobjekte können auch als Parameter übergeben und auch als Rückgabeergebnis einer Funktion verwendet werden. Darüber hinaus können Funktionen in Python verschachtelt werden.
Python basiert auf Funktionsobjekten und bietet Unterstützung für die grammatikalische Struktur von Abschlüssen
Schauen wir uns zunächst ein Beispiel an
def f1(): name1 = 'Alice' name2 = 'Bob' def f2(): print('hello,%s,%s' %(name1,name2)) return f2 if __name__ == '__main__': name1 = 'David' name2 = 'Frank' func = f1() func() print(func.__closure__) print(func.__closure__[0].cell_contents) print(func.__closure__[1].cell_contents)# 输出hello,Alice,Bob (<cell at 0x03A55CF0: str object at 0x03CBEA20>, <cell at 0x03CBEAD0: str object at 0x03CBEAA0>) Alice Bob
Funktion f2 ist in Funktion f1 definiert. Und die in f1 definierten Variablen name1 und name2 werden aufgerufen.
f1 gibt das Funktionsobjekt f2 zurück, aber tatsächlich enthält das zurückgegebene f2 bereits die Variablen name1 und name2 in f1, was aus den laufenden Ergebnissen des Codes ersichtlich ist.
Obwohl Name1 und Name2 im Hauptprogramm neu definiert werden, wird der Variablenwert bei Ausführung der Funktion func immer noch aufgerufen, wenn er definiert ist, dh seine Referenzumgebungsvariable, nicht der Variablenwert, wenn er definiert ist gebraucht.
Zusammenfassend lässt sich sagen, dass ein Abschluss in Python ein Codeblock ist, der Funktionen und referenzierte Umgebungsvariablen enthält. Ich neige dazu, Abschlüsse als Codestruktur und nicht als Funktion zu betrachten, da sie beim ersten Aufruf verwendet werden. Es umschließt nur die Referenzumgebung des Abschlusses und die interne Funktion und gibt sie als Funktionsobjekt zurück, ohne die interne Funktion auszuführen. Wenn dieses Funktionsobjekt aufgerufen wird, wird die interne Funktion ausgeführt.
Der Wert der referenzierten Umgebungsvariablen wird in der Abschlusseigenschaft des Funktionsobjekts gespeichert. Der Abschluss enthält ein Tupel. Jedes Element in diesem Tupel ist ein Objekt vom Typ Zelle. Wir sehen, dass die erste Zelle Alice enthält, was der Wert der Umgebungsvariablen name1 ist, als wir den Abschluss erstellt haben. Dies ist aus den Ergebnissen des obigen Codes ersichtlich.
Schauen Sie jetzt zurück und sehen Sie sich die Erklärung der Schließungen in der Enzyklopädie an.
Geben Sie nun ein weiteres Beispiel:
# 此例子转自伯乐在线def line_def(a, b): def line(x): return a * x + b return lineif __name__ == '__main__': func = line_def(2, 3) print(func(5))# 输出13
In diesem Beispiel bilden die Funktionszeile und die Umgebungsvariablen a, b einen Abschluss. Wir müssen nur die Werte von a ändern , b. Es können verschiedene Geradenfunktionen erhalten werden, was die Kapselung verbessert, sodass wir nur auf die Parameter a und b achten müssen und uns nicht um die Implementierung der internen Geraden kümmern müssen.
Das größte Merkmal des Abschlusses besteht darin, dass er die Variablen der externen Funktion an die interne Funktion binden und die Funktion nach dem Binden der Variablen (dh des Abschlusses) zurückgeben kann Zu diesem Zeitpunkt, auch wenn die Umgebung in dem der Abschluss generiert wird (externe Funktion) wurde freigegeben, der Abschluss existiert noch.
Eine Hauptanwendung von Verschlüssen sind Dekoratoren, aber sie übergeben Funktionen. Das schreibe ich das nächste Mal.
Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in Python-Verschlüsse. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!