Ein Iterator ist ein beliebiges Objekt, das zwei Methoden implementiert:
Erstellen eines einfachen Iterators:
class Counter: def __init__(self, start, end): self.current = start self.end = end def __iter__(self): return self # Returns itself as an iterator def __next__(self): if self.current >= self.end: raise StopIteration self.current += 1 return self.current - 1 counter = Counter(1, 4) for number in counter: print(number) # Outputs: 1, 2, 3
Diese Klasse steuert den next()-Aufruf manuell und stoppt, wenn er das Ende erreicht. Iteratoren sind nützlich für die Arbeit mit Sequenzen, bei denen jedes Element bei Bedarf verarbeitet wird.
Ein Generator ist eine einfachere Möglichkeit, einen Iterator zu erstellen. Definiert mit einer Funktion, die das Schlüsselwort yield verwendet, unterbricht es die Funktionsausführung bei yield und setzt sie fort, wenn next() aufgerufen wird. Jede yield-Anweisung speichert den Status der Funktion, sodass sie dort weitermachen kann, wo sie aufgehört hat.
Einfaches Generatorbeispiel:
def countdown(num): while num > 0: yield num num -= 1 for n in countdown(3): print(n) # Outputs: 3, 2, 1
Wenn yield aufgerufen wird, gibt die Funktion den aktuellen Wert zurück und pausiert und wartet darauf, dass next() fortgesetzt wird.
Generatoren berechnen Werte im laufenden Betrieb, was als Lazy Evaluation bezeichnet wird. Im Gegensatz zu Listen, die alle Elemente im Speicher speichern, erzeugen Generatoren Elemente nur nach Bedarf, was ideal ist für:
Beispiel: Lesen großer Dateien mit Generatoren:
def read_large_file(file_path): with open(file_path) as file: for line in file: yield line # Only processes one line at a time
Dieser Ansatz verhindert das Laden der gesamten Datei in den Speicher, was besonders bei großen Dateien nützlich ist.
Ein Generatorausdruck ist eine prägnante Möglichkeit, Generatoren zu erstellen, indem Klammern anstelle von eckigen Klammern wie beim Listenverständnis verwendet werden.
Beispiel:
squares = (x * x for x in range(5)) print(next(squares)) # Outputs: 0 print(list(squares)) # Outputs remaining: [1, 4, 9, 16]
Quadrate berechnet hier Werte nur auf Anfrage, wodurch es speichereffizient ist.
Die yield from-Anweisung ist nützlich, um einen Teil der Operationen eines Generators an einen anderen Generator zu delegieren. Dies ist hilfreich, wenn Sie einen Generator aus Gründen der Modularität in Untergeneratoren aufteilen möchten.
Beispiel:
def generator_a(): yield 1 yield 2 def generator_b(): yield from generator_a() yield 3 for val in generator_b(): print(val) # Outputs: 1, 2, 3
Ertrag durch optimierten Code, insbesondere in komplexen oder verschachtelten Generatorketten.
Generatoren sind besonders nützlich, wenn:
Listen hingegen sind besser, wenn:
Mit Iteratoren und Generatoren gibt Ihnen Python die Kontrolle über die Datenverarbeitung mit Speichereffizienz und Flexibilität. Sie sind für die Verarbeitung großer Datensätze, das Streamen von Daten und die Erstellung benutzerdefinierter iterierbarer Objekte unerlässlich.
Beherrschen Sie diese und Sie werden mit Daten wie ein Python-Profi umgehen! ?
Das obige ist der detaillierte Inhalt vonTiefes Verständnis für Python-Iteratoren: Navigieren in Daten mit „__iter__' und „__next__'.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!