Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| modul:m323:learningunits:lu05:closures [2024/03/28 14:07] – angelegt - Externe Bearbeitung 127.0.0.1 | modul:m323:learningunits:lu05:closures [2026/09/01 11:35] (aktuell) – Korrektur: Anzahl Muster und Sortierbeispiel mit unterscheidbarer Ausgabe admin | ||
|---|---|---|---|
| Zeile 24: | Zeile 24: | ||
| In diesem Beispiel ist '' | In diesem Beispiel ist '' | ||
| + | |||
| + | ===== Animation: was im Speicher passiert ===== | ||
| + | |||
| + | Die Animation zeigt genau dieses Beispiel Schritt für Schritt: wie der Rahmen von '' | ||
| + | |||
| + | {{url> | ||
| ===== Wie Closures arbeiten ===== | ===== Wie Closures arbeiten ===== | ||
| Zeile 31: | Zeile 37: | ||
| * Das ermöglicht es, Zustand und Daten zwischen mehreren Aufrufen der inneren Funktion zu speichern. | * Das ermöglicht es, Zustand und Daten zwischen mehreren Aufrufen der inneren Funktion zu speichern. | ||
| - | ===== Verwendungszwecke | + | ===== Closures in der Praxis |
| - | * **Zustandsspeicherung**: | + | '' |
| - | * **Datenkapselung**: | + | |
| - | * **Funktionsfabriken**: | + | |
| - | * **Decorators**: | + | |
| - | <WRAP center round info 60%> | + | <WRAP center round info 90%> |
| - | Closures | + | **Die Faustregel: |
| + | </ | ||
| + | |||
| + | ==== 1. Funktionsfabrik: | ||
| + | |||
| + | Statt bei jedem Aufruf den Steuersatz mitzugeben, erzeugt man einmal eine Funktion, die ihn bereits kennt: | ||
| + | |||
| + | <code python> | ||
| + | def preis_mit_steuer(satz): | ||
| + | def berechne(netto): | ||
| + | return round(netto * (1 + satz / 100), 2) | ||
| + | return berechne | ||
| + | |||
| + | schweiz = preis_mit_steuer(8.1) | ||
| + | deutschland = preis_mit_steuer(19) | ||
| + | |||
| + | print(schweiz(100)) | ||
| + | print(deutschland(100)) | ||
| + | </ | ||
| + | |||
| + | '' | ||
| + | |||
| + | ==== 2. Kriterien für '' | ||
| + | |||
| + | Funktionen wie '' | ||
| + | |||
| + | <code python> | ||
| + | def nach_feld(feld): | ||
| + | def schluessel(eintrag): | ||
| + | return eintrag[feld] | ||
| + | return schluessel | ||
| + | |||
| + | produkte = [ | ||
| + | {" | ||
| + | {" | ||
| + | {" | ||
| + | ] | ||
| + | |||
| + | for p in sorted(produkte, | ||
| + | print(p[" | ||
| + | print() | ||
| + | for p in sorted(produkte, | ||
| + | print(p[" | ||
| + | </ | ||
| + | |||
| + | So wird aus dem Klick auf eine Tabellenspalte im UI direkt die passende Sortierfunktion – ohne für jede Spalte eine eigene Funktion zu schreiben. | ||
| + | |||
| + | ==== 3. Zustand kapseln statt globaler Variablen ==== | ||
| + | |||
| + | Ein Closure kann sich zwischen den Aufrufen etwas merken. Mit '' | ||
| + | |||
| + | <code python> | ||
| + | def zaehler_erstellen(): | ||
| + | anzahl = 0 | ||
| + | def hochzaehlen(): | ||
| + | nonlocal anzahl | ||
| + | anzahl += 1 | ||
| + | return anzahl | ||
| + | return hochzaehlen | ||
| + | |||
| + | klicks = zaehler_erstellen() | ||
| + | fehler = zaehler_erstellen() | ||
| + | |||
| + | print(klicks()) | ||
| + | print(klicks()) | ||
| + | print(fehler()) | ||
| + | </ | ||
| + | |||
| + | Der entscheidende Punkt: '' | ||
| + | |||
| + | ==== 4. Callbacks in Oberflächen und Event-Systemen ==== | ||
| + | |||
| + | Ein Button erwartet eine Funktion ohne Argumente. Trotzdem muss beim Klick klar sein, //welcher// Button gedrückt wurde – das Closure transportiert diese Information: | ||
| + | |||
| + | <code python> | ||
| + | def klick_handler(button_name): | ||
| + | def bei_klick(): | ||
| + | print(f" | ||
| + | return bei_klick | ||
| + | |||
| + | # button.on_click(klick_handler(" | ||
| + | klick_handler(" | ||
| + | </ | ||
| + | |||
| + | Dasselbe Muster steckt hinter Event-Listenern in JavaScript, Callbacks in GUI-Frameworks und Retry-Logik, | ||
| + | |||
| + | ==== 5. Decorators ==== | ||
| + | |||
| + | Decorators sind die verbreitetste Anwendung von Closures überhaupt: Die äußere Funktion nimmt eine Funktion entgegen, die innere „erinnert" | ||
| + | |||
| + | <WRAP center round important 90%> | ||
| + | **Stolperfalle: | ||
| + | |||
| + | Ein Closure speichert die **Variable**, | ||
| + | |||
| + | <code python> | ||
| + | funktionen = [lambda: i for i in range(3)] | ||
| + | print([f() for f in funktionen]) | ||
| + | </ | ||
| + | |||
| + | Alle drei Funktionen teilen sich dieselbe Variable '' | ||
| + | |||
| + | <code python> | ||
| + | funktionen = [lambda i=i: i for i in range(3)] | ||
| + | print([f() for f in funktionen]) | ||
| + | </ | ||
| </ | </ | ||
| ---- | ---- | ||
| - | {{tag> | + | {{tag> |
| [[https:// | [[https:// | ||
| + | |||