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)
hat aber zusätzlich __next__-Methode
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
a = [1,2,3,4,5,6,7]
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:
(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, danach beendet und die Anweisung ist wesentlich übersichtlicher als eine for-Schleife mit break-Statement.
Alle Ergebnisse eines Generators
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/generiert das nächste Ergebnis
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