* 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
* 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
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