* 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