Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung | |||
| modul:m323:learningunits:lu04:generatoren [2025/12/18 13:20] – kmaurizi | modul:m323:learningunits:lu04:generatoren [2025/12/18 21:21] (aktuell) – kmaurizi | ||
|---|---|---|---|
| Zeile 6: | Zeile 6: | ||
| Ein Generator ist ein spezieller Typ von Iterator, der mit einer Funktion und dem Schlüsselwort '' | Ein Generator ist ein spezieller Typ von Iterator, der mit einer Funktion und dem Schlüsselwort '' | ||
| + | |||
| + | ===== Wichtige Eigenschaften ===== | ||
| + | |||
| + | * **Lazy**: Werte werden erst erzeugt, wenn sie gebraucht werden (z.B. im '' | ||
| + | * **Einmal konsumierbar**: | ||
| + | * **Zustand bleibt erhalten**: Lokale Variablen behalten ihren Wert zwischen zwei '' | ||
| ===== Syntax ===== | ===== Syntax ===== | ||
| Zeile 16: | Zeile 22: | ||
| yield 2 | yield 2 | ||
| yield 3 | yield 3 | ||
| + | </ | ||
| + | |||
| + | ===== Generator vs. normale Funktion ===== | ||
| + | |||
| + | Eine normale Funktion liefert genau einen Rückgabewert und endet. Ein Generator liefert mehrere Werte nacheinander: | ||
| + | |||
| + | <code python> | ||
| + | def normal_function(): | ||
| + | return 1 | ||
| + | return 2 # wird nie erreicht | ||
| + | |||
| + | def generator_function(): | ||
| + | yield 1 | ||
| + | yield 2 # wird erreicht, wenn weiter iteriert wird | ||
| + | |||
| + | print(normal_function()) | ||
| + | gen = generator_function() | ||
| + | print(next(gen)) | ||
| + | print(next(gen)) | ||
| </ | </ | ||
| ===== Beispiele ===== | ===== Beispiele ===== | ||
| - | === Einfacher Generator === | + | ==== Einfacher Generator |
| Ein einfacher Generator, der die Zahlen 1 bis 3 zurückgibt: | Ein einfacher Generator, der die Zahlen 1 bis 3 zurückgibt: | ||
| Zeile 31: | Zeile 56: | ||
| gen = simple_generator() | gen = simple_generator() | ||
| - | print(next(gen)) | + | print(next(gen)) |
| - | print(next(gen)) | + | print(next(gen)) |
| - | print(next(gen)) | + | print(next(gen)) |
| </ | </ | ||
| - | === Generator mit Schleife === | + | ==== Generator mit Schleife |
| Ein Generator, der die Quadrate der Zahlen von 1 bis n zurückgibt: | Ein Generator, der die Quadrate der Zahlen von 1 bis n zurückgibt: | ||
| Zeile 42: | Zeile 67: | ||
| <code python> | <code python> | ||
| def square_numbers(n): | def square_numbers(n): | ||
| - | for i in range(1, n+1): | + | for i in range(1, n + 1): |
| yield i * i | yield i * i | ||
| Zeile 53: | Zeile 78: | ||
| </ | </ | ||
| - | === Generator Expression === | + | ==== Generator Expression |
| Generator Expressions sind eine kompaktere Art, Generatoren zu erstellen, ähnlich wie List Comprehensions: | Generator Expressions sind eine kompaktere Art, Generatoren zu erstellen, ähnlich wie List Comprehensions: | ||
| <code python> | <code python> | ||
| - | squared = (x*x for x in range(6)) | + | squared = (x * x for x in range(6)) |
| - | print(next(squared)) | + | print(next(squared)) |
| - | print(next(squared)) | + | print(next(squared)) |
| + | </ | ||
| + | |||
| + | ===== Typische Verwendung: for-Loop statt next() ===== | ||
| + | |||
| + | In der Praxis nutzt man Generatoren meistens im '' | ||
| + | |||
| + | <code python> | ||
| + | def countdown(n): | ||
| + | while n > 0: | ||
| + | yield n | ||
| + | n -= 1 | ||
| + | |||
| + | for value in countdown(3): | ||
| + | print(value) | ||
| + | |||
| + | # Output: | ||
| + | # 3 | ||
| + | # 2 | ||
| + | # 1 | ||
| + | </ | ||
| + | |||
| + | ===== StopIteration: | ||
| + | |||
| + | Wenn ein Generator keine Werte mehr liefern kann, endet er. Bei '' | ||
| + | |||
| + | <code python> | ||
| + | gen = (x for x in range(2)) | ||
| + | print(next(gen)) | ||
| + | print(next(gen)) | ||
| + | |||
| + | # nächster Aufruf -> StopIteration | ||
| + | # print(next(gen)) | ||
| + | </ | ||
| + | |||
| + | ===== Generatoren sind Iteratoren ===== | ||
| + | |||
| + | Ein Generator ist selbst ein Iterator: '' | ||
| + | |||
| + | <code python> | ||
| + | gen = (x for x in range(3)) | ||
| + | print(iter(gen) is gen) # True | ||
| </ | </ | ||
| Zeile 68: | Zeile 134: | ||
| * **Einfachheit**: | * **Einfachheit**: | ||
| * **Vielseitigkeit**: | * **Vielseitigkeit**: | ||
| + | * **Abbruch möglich**: Man kann früh aufhören zu iterieren (z.B. nach dem ersten Treffer). Der Rest wird gar nie berechnet. | ||
| ===== Verständnis des '' | ===== Verständnis des '' | ||
| - | Das Schlüsselwort '' | + | Das Schlüsselwort '' |
| + | |||
| + | ===== Mini-Zusammenfassung ===== | ||
| + | |||
| + | ^ Begriff ^ Bedeutung ^ | ||
| + | | '' | ||
| + | | Generator | Iterator, der Werte "lazy" | ||
| + | | '' | ||
| + | | Generator Expression | Kurzform: '' | ||
| ---- | ---- | ||
| {{tag> | {{tag> | ||
| - | [[https:// | + | [[https:// |