Closures und freie Variablen
Zustand in inneren Funktionen erfassen
Closures und freie Variablen ist eine kostenlose Python Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Python Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Python Academy-Kurs umfasst insgesamt 4 Lektionen.
Verschachtelte Funktionen
In Python können Sie eine Funktion innerhalb einer anderen Funktion definieren. Die innere Funktion wird jedes Mal neu erstellt, wenn die äußere Funktion ausgeführt wird.
def outer():
def inner():
return 'from inner'
return inner()
print(outer())Die innere Funktion sieht äußere Variablen
Eine innere Funktion kann Variablen lesen, die in der einschließenden Funktion definiert sind. Diese werden als freie Variablen bezeichnet, weil sie nicht lokal zur inneren Funktion sind.
def outer():
message = 'hello'
def inner():
return message
return inner()
print(outer())Was ist eine Closure?
Eine Closure entsteht, wenn eine innere Funktion zurückgegeben wird und sich weiterhin an die freien Variablen aus ihrem einschließenden Gültigkeitsbereich erinnert, selbst nachdem dieser Gültigkeitsbereich beendet ist.
def make_greeter(name):
def greet():
return 'Hi ' + name
return greet
g = make_greeter('Ada')
print(g())Der erfasste Zustand bleibt erhalten
Die äußere Funktion wurde bereits beendet, dennoch hält die Closure weiterhin name fest. Der Wert bleibt innerhalb der zurückgegebenen Funktion erhalten.
def make_greeter(name):
def greet():
return 'Hi ' + name
return greet
a = make_greeter('Ada')
b = make_greeter('Bob')
print(a())
print(b())Eine Multiplikatorfabrik
Closures eignen sich hervorragend als Fabriken, die angepasste Funktionen erzeugen. Hier multipliziert jede zurückgegebene Funktion mit einem erfassten Faktor.
def multiplier(factor):
def multiply(n):
return n * factor
return multiply
double = multiplier(2)
triple = multiplier(3)
print(double(10))
print(triple(10))Jede Closure ist unabhängig
Jeder Aufruf der Fabrik erstellt eine eigene Closure mit ihrem eigenen erfassten Wert. Die Closures beeinflussen sich nicht gegenseitig.
def adder(amount):
def add(n):
return n + amount
return add
add5 = adder(5)
add100 = adder(100)
print(add5(1), add100(1))Erfasste Werte untersuchen
Die erfassten Namen sind in __code__.co_freevars aufgeführt, und ihre Werte befinden sich in den Zellen von __closure__.
def make(x):
def f():
return x
return f
fn = make(42)
print(fn.__code__.co_freevars)
print(fn.__closure__[0].cell_contents)Closures erfassen Variablen, keine Werte
Eine Closure erfasst die Variable selbst und sieht daher den endgültigen Wert der Variable. Das ist wichtig, wenn sich die Variable nach der Erstellung der Closure ändert.
def build():
x = 1
def show():
return x
x = 99
return show
print(build()())Die Falle der späten Bindung in Schleifen
Ein klassischer Stolperstein: In einer Schleife erstellte Closures verwenden alle dieselbe Schleifenvariable und erfassen daher deren letzten Wert.
funcs = []
for i in range(3):
funcs.append(lambda: i)
print([f() for f in funcs])Späte Bindung beheben
Binden Sie den aktuellen Wert mit einem Standardargument, damit jede Closure zum Zeitpunkt ihrer Definition ihre eigene Kopie erfasst.
funcs = []
for i in range(3):
funcs.append(lambda i=i: i)
print([f() for f in funcs])Closures als leichtgewichtige Objekte
Eine Closure bündelt Daten und Verhalten ähnlich wie ein kleines Objekt – für einfache Fälle ist das oft übersichtlicher als eine vollständige Klasse.
def counter_start(start):
def value():
return start
return value
c = counter_start(10)
print(c())Wissenscheck
Was ist eine Closure in Python?
Rückblick: Closures und freie Variablen
Die wichtigsten Konzepte:
- Innere Funktionen können Variablen aus dem einschließenden Gültigkeitsbereich lesen (freie Variablen).
- Eine Closure ist eine zurückgegebene innere Funktion, die sich diese Variablen merkt.
- Jeder Aufruf einer Fabrik erstellt eine unabhängige Closure.
- Closures erfassen Variablen, keine Werte. Das verursacht die Falle der späten Bindung in Schleifen – beheben Sie sie mit einem Standardargument.
def power_of(exp):
return lambda base: base ** exp
square = power_of(2)
print(square(9))Häufig gestellte Fragen
Ist die Lektion „Closures und freie Variablen“ kostenlos?
Ja — der vollständige Text von „Closures und freie Variablen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Python Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Python Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Closures und freie Variablen“?
Zustand in inneren Funktionen erfassen Du übst Python Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Python Academy zu starten?
Keine Vorkenntnisse erforderlich. Python Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „Closures und freie Variablen“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Python Academy-Lektion Code schreiben und ausführen?
Ja. Jede Python Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Funktionen erster Klasse
- Closures und freie Variablen
- nonlocal und veränderlicher Zustand
- Partielle Funktionen