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 |