Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
| talit:generators [2025-08-15 07:35] – hof | talit:generators [2026-04-27 12:48] (aktuell) – hof | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| # Iteratoren und Generatoren in Python | # Iteratoren und Generatoren in Python | ||
| - | |||
| - | < | ||
| Eine [[wpde> | Eine [[wpde> | ||
| Zeile 13: | Zeile 11: | ||
| Unser erster Versuch: Schreibe eine Funktion, die die ersten `n` Elemente der Fibonacci-Folge generiert und in einer Liste zurückgibt. Untenstehender Code funktioniert nur für $n\le10$ -- ändere den Code so, dass er für beliebig grosse $n$ das richtige Resultat zurückgibt! | Unser erster Versuch: Schreibe eine Funktion, die die ersten `n` Elemente der Fibonacci-Folge generiert und in einer Liste zurückgibt. Untenstehender Code funktioniert nur für $n\le10$ -- ändere den Code so, dass er für beliebig grosse $n$ das richtige Resultat zurückgibt! | ||
| - | < | + | < |
| first_few = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55] | first_few = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55] | ||
| result = [] | result = [] | ||
| Zeile 20: | Zeile 18: | ||
| return result | return result | ||
| - | print(fibonacci(10))</ | + | print(fibonacci(10))</ |
| <nodisp 0> | <nodisp 0> | ||
| Zeile 59: | Zeile 57: | ||
| Analysiere den untenstehenden Code und führe ihn aus. Ändere den Code, so dass die erste Fibonacci Zahl ausgegeben wird, die grösser als 1000 ist! | Analysiere den untenstehenden Code und führe ihn aus. Ändere den Code, so dass die erste Fibonacci Zahl ausgegeben wird, die grösser als 1000 ist! | ||
| - | < | + | < |
| def __init__(self, | def __init__(self, | ||
| # Constructor - hier wird der Initial-Zustand gespeichert | # Constructor - hier wird der Initial-Zustand gespeichert | ||
| Zeile 76: | Zeile 74: | ||
| print(next(iterator)) | print(next(iterator)) | ||
| print(next(iterator)) | print(next(iterator)) | ||
| - | print(next(iterator))</ | + | print(next(iterator))</ |
| Zeile 112: | Zeile 110: | ||
| Untenstehender Code fügt dem bestehenden Iterator ein Iterable hinzu, so dass wir eine for-Schleife nützen können: | Untenstehender Code fügt dem bestehenden Iterator ein Iterable hinzu, so dass wir eine for-Schleife nützen können: | ||
| - | < | + | < |
| def __init__(self, | def __init__(self, | ||
| # Hier wird der Zustand gespeichert | # Hier wird der Zustand gespeichert | ||
| Zeile 136: | Zeile 134: | ||
| print(f' | print(f' | ||
| break | break | ||
| - | </ | + | </ |
| Die Funktionen `__iter__` und `__next__` dürfen auch von derselben Klasse implementiert werden. | Die Funktionen `__iter__` und `__next__` dürfen auch von derselben Klasse implementiert werden. | ||
| Zeile 149: | Zeile 147: | ||
| Ein Generator ist ein Iterable und kann damit auch als Ausdruck nach `in` in einer `for ... in < | Ein Generator ist ein Iterable und kann damit auch als Ausdruck nach `in` in einer `for ... in < | ||
| - | < | + | < |
| one = 0 | one = 0 | ||
| two = 1 | two = 1 | ||
| Zeile 160: | Zeile 158: | ||
| print(f' | print(f' | ||
| break | break | ||
| - | </ | + | </ |
| ### Iteration beenden | ### Iteration beenden | ||
| Zeile 171: | Zeile 169: | ||
| Der folgende Code soll also `143` ausgeben: | Der folgende Code soll also `143` ausgeben: | ||
| - | < | + | < |
| pass | pass | ||
| n=10 | n=10 | ||
| print(f' | print(f' | ||
| - | </ | + | </ |
| ## Yield From | ## Yield From | ||
| Zeile 189: | Zeile 187: | ||
| Eine rekursive Umsetzung könnte wie folgt aussehen - beachte, wie `yield from` eingesetzt wird, um die rekursive Traversierung zu erreichen. | Eine rekursive Umsetzung könnte wie folgt aussehen - beachte, wie `yield from` eingesetzt wird, um die rekursive Traversierung zu erreichen. | ||
| - | < | + | < |
| def __init__(self, | def __init__(self, | ||
| self.key = key | self.key = key | ||
| Zeile 203: | Zeile 201: | ||
| - | tree = Node(5, Node(1), Node(7)) | + | tree = Node(5, Node(2, Node(1), Node(3)), Node(7)) |
| for node in tree.in_order_traversal(): | for node in tree.in_order_traversal(): | ||
| - | </ | + | </ |
| ### Aufgabe 4: Pre-Order Traversierung | ### Aufgabe 4: Pre-Order Traversierung | ||
| - | Füge eine Methode `pre_order_traversal` hinzu, die zuerst jeweils den Knoten selbst, dann den linken und rechten Teilbaum besucht. Die Reihenfolge des Besuchs sollte also `5 1 7` ausgeben. | + | Füge eine Methode `pre_order_traversal` hinzu, die zuerst jeweils den Knoten selbst, dann den linken und rechten Teilbaum besucht. Die Reihenfolge des Besuchs sollte also `5 2 1 3 7` ausgeben. |
| ### Weiter? | ### Weiter? | ||
| Zurück zum [[talit: | Zurück zum [[talit: | ||