Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
|
python:generator [2020/03/02 08:19] root angelegt |
python:generator [2020/03/05 13:46] (aktuell) root [Generator Expressions] |
||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | * Im Gegensatz zu einem Iterator der bestehende Daten durchläuft (eine Liste, ein dict), erzeugt der Generator erst bei jedem Aufruf (__nex__-Methode) den nächsten Datensatz | + | * Im Gegensatz zu einem Iterator der bestehende Daten durchläuft (eine Liste, ein dict), erzeugt der Generator erst bei jedem Aufruf (%%__%%next%%__%%-Methode) den nächsten Datensatz |
| - | * kann auch wie ein Iterator angesprochen werden (hat __iter__-Methode) | + | * kann auch wie ein Iterator angesprochen werden (hat %%__iter__%%-Methode) |
| - | * hat aber zusätzlich __next__-Methode | + | * hat aber zusätzlich |
| * weißt den Generator an das nächste Element zu erzeugen und zurück zu geben | * weißt den Generator an das nächste Element zu erzeugen und zurück zu geben | ||
| + | * wenn der Generator keine weiteren Elemente hat erzeugt der Aufruf von %%__next__%% StopIteration Exception | ||
| + | * more_itertools stellt einige Werzeuge zur Verfügung um zum Beispiel das nur das erste Element oder nur das letzte in einem Generator zu bekommen | ||
| + | |||
| + | |||
| + | ====== Generator Expressions ====== | ||
| + | |||
| + | * Ähnlich list comprehension | ||
| + | * Die angegebene Anweisung wird als Generator ausgeführt | ||
| + | * der Ausdruck in Klammern wird ausgeführt bis er ein Ergebnis liefert und dieses zurück gegeben | ||
| + | * erst beim nächsten Aufruf von __next__ (was indirekt erfolgen kann) wird erneut die Anweisung in Klammern ausgeführt | ||
| + | * man kann damit Anweisungen die eine for-Schleife mit einem if-Statement und darin einem break-Statement benötigen (die also die Schleife vorzeitig abbrechen) ggf. kürzer schreiben | ||
| + | |||
| + | |||
| + | <sxh python> | ||
| + | a = [1, | ||
| + | |||
| + | b = next (i for i in a if i == 4) | ||
| + | </ | ||
| + | |||
| + | In obigem Beispiel wird ein generator erstellt (der Ausdruck in den Klammern) der die Werte in a durchläuft und etwas zurückgibt wenn der aktuell durchlaufene Wert 4 ist. \\ | ||
| + | Der Aufruf von next ruft die interne Methode __next__ einmal auf -> man könnte es auch so schreiben: | ||
| + | |||
| + | <sxh python> | ||
| + | (i for i in a if i == 4).__next__() | ||
| + | </ | ||
| + | |||
| + | Das Ergebnis des obigen Aufrufs ist 4. \\ | ||
| + | Der Generator wird einmal aufgerufen (per next) und arbeitet dann einmal die Anweisungen in Klammern durch bis ein Ergebnis gefunden wird -> die Anweisung ist durchlaufe alle Werte von a und gebe etwas zurück wenn der aktuelle Wert der Schleife 4 ist.\\ \\ | ||
| + | Der Vorteil hier ist, die Schleife wird nur bis zum erreichen von 4 ausgeführt, | ||
| + | |||
| + | |||
| + | ===== Alle Ergebnisse eines Generators ===== | ||
| + | |||
| + | <sxh python> | ||
| + | a=*(records.name for i in records) | ||
| + | </ | ||
| + | Oben stehendes würde ein Expansion auf den Generator machen und alle Ergebnisse des Generators in a speichern. | ||
| + | ====== Hilfs-Ausdrücke ====== | ||
| + | |||
| + | * next -> Ruft die __next__-Methode eines Generators auf/ | ||
| + | * more%%_%%itertools.first -> Gibt den ersten Wert eines Generators zurück - im Prinzip wie einmalig next aufrufen, aber erlaubt die Rückgabe eines Default-Wertes wenn StopIteration auftritt | ||
| + | * more%%_%%itertools.last -> Gibt den letzten Wert eines Generators zurück | ||
| + | * more_itertools -> hat noch ein paar mehr Funktionen für Generatoren | ||