Benutzer-Werkzeuge

Webseiten-Werkzeuge


python:generator

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

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 %%__next__%%-Methode
       * 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,2,3,4,5,6,7]
 +
 +b = next (i for i in a if i == 4) 
 +</sxh>
 +
 +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__()
 +</sxh>
 +
 +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 =====
 +
 +<sxh python>
 +a=*(records.name for i in records)
 +</sxh>
 +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
python/generator.1583133556.txt.gz · Zuletzt geändert: 2020/03/02 08:19 von root