Benutzer-Werkzeuge

Webseiten-Werkzeuge


python:generator
  • 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
python/generator.txt · Zuletzt geändert: 2020/03/05 13:46 von root