Ich möchte einen Python-Generator viele Male iterieren

Der Python-Generator ist nützlich, aber sobald Sie ihn in einer Schleife mit einer for-Anweisung verwenden, sieht er wie ein Carappo aus, wenn Sie versuchen, ihn in einer for-Anweisung erneut zu verwenden.

def i(n):
    yield n + 1
    yield n + 2


g = i(10)
print('first time:')
for n in g:
    print(n)

print('second time:')
for n in g:
    print(n)

Die Ausgabe ist

first time:
11
12
second time:

Es wird sein. In der zweiten for-Schleife werden keine Elemente iteriert.

In Situationen, in denen Sie möchten, dass "11" und "12" in der zweiten und den folgenden "for" -Schleifen zurückkehren, haben die folgenden Techniken funktioniert.

class ReiteratableWrapper(object):
    def __init__(self, f):
        self._f = f

    def __iter__(self):
        return self._f()

def i(n):
    yield n + 1
    yield n + 2

import functools
f = functools.partial(i, 10)

g2 = ReiteratableWrapper(f)
for n in g2:
    print(n)

for n in g2:
    print(n)

Kommentar

Die Klasse "ReiteratableWrapper" übernimmt eine Generatorfunktion. Da es aufgerufen wird, ohne intern ein Argument anzugeben, erstellen Sie, wenn Sie einen Generatoraufruf mit einem Argument durchführen möchten, eine Funktion ohne Argument, die das Argument mit der Funktion functools.partial usw. wie im Beispiel bindet.

Ausdrücke, die im Kontext nach in der for-Anweisung ausgewertet werden, werden als "iter" -Methode bezeichnet. Daher erstellt eine Instanz von "Reiteratable Wrapper" jedes Mal automatisch einen neuen Generator.

Jedes Mal, wenn die Methode iter ausgewertet wird, wird die Generatorfunktion ausgewertet und ausgeführt. Wenn also beim Aufrufen der Generatorfunktion ein Nebeneffekt auftritt, z. B. eine Begrenzung der Häufigkeit, mit der die Generatorfunktion ausgeführt werden kann, kann sie nicht wiederholt verwendet werden. Ich denke da ist etwas.

Ich denke, die diesmal eingeführte Technik ist effektiv für Inhalte, die wiederholt werden können, z. B. das Lesen aus einer Datei, um Speicherplatz zu sparen, jedes Mal eine Abfrage an die Datenbank zu senden und in der angegebenen Reihenfolge zu iterieren.

Referenzlink

Recommended Posts

Ich möchte einen Python-Generator viele Male iterieren
Ich möchte eine Python-Umgebung erstellen
Ich möchte mit Python ein Fenster erstellen
Ich möchte ein Spiel mit Python machen
Ich möchte mit Python in eine Datei schreiben
Ich möchte einen Mox-Generator
Ich möchte einen Mox-Generator (2)
Ich möchte eine Variable in einen Python-String einbetten
Ich möchte Timeout einfach in Python implementieren
Ich möchte schnell UUID generieren (Gedenknotiz) ~ Python Edition ~
Ich möchte in Python schreiben! (2) Schreiben wir einen Test
Ich möchte eine Datei mit Python zufällig testen
Ich möchte mit einem Roboter in Python arbeiten.
[Python] Ich möchte aus einer verschachtelten Liste einen Taple machen
Ich möchte einen Quantencomputer mit Python betreiben
Ich möchte mit Python debuggen
[Python] Ich möchte einen gemeinsamen Satz zwischen numpy erhalten
Ich möchte viele Prozesse von Python aus starten
Ich möchte eine Nachricht von Python an LINE Bot senden
Ich möchte eine schöne Ergänzung zu input () in Python hinzufügen
Ich möchte einen Platzhalter verwenden, den ich mit Python entfernen möchte
Ich möchte in der Einschlussnotation drucken
Ich möchte ein Glas aus Python verwenden
Ich möchte den vollständigen Text mit elasticsearch + python durchsuchen
Ich möchte Protokolle mit Python analysieren
Ich möchte mit aws mit Python spielen
[Einführung] Ich möchte mit Python einen Mastodon-Bot erstellen! 【Anfänger】
Ich habe einen Passwortgenerator erstellt, um Kindern Python3 beizubringen (Bonus) * Vollständig neu erstellt
[Python-Memo] Ich möchte eine zweistellige Hexadezimalzahl aus einer Dezimalzahl erhalten
Ich möchte eine in Python in PDF konvertierte Tabelle wieder in CSV konvertieren
Ich möchte einen Teil der Excel-Zeichenfolge mit Python einfärben
Python: Ich möchte die Verarbeitungszeit einer Funktion genau messen
Ich möchte eine Webanwendung mit React und Python Flask erstellen
Ich möchte Affenpatches nur teilweise sicher mit Python machen
Ich möchte Matplotlib zu einem dunklen Thema machen
Ich möchte Dunnetts Test in Python machen
Ich möchte einfach ein Rauschmodell erstellen
Ich möchte MATLAB feval mit Python verwenden
Ich möchte einen DataFrame in MSSQL einfügen
Ich möchte mich mit Schlüsselwortargumenten von Python merken
Ich möchte mit Python eine E-Mail von Google Mail senden.
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 1/3
Ich möchte keinen Codierungstest machen
Ich möchte verschachtelte Dicts in Python zusammenführen
Ich möchte Temporäres Verzeichnis mit Python2 verwenden
Ich möchte Ceres Solver aus Python verwenden
#Unresolved Ich möchte Gobject-Introspection mit Python3 kompilieren
Ich möchte eine Art von Implementierung erstellen, die angeschlossen werden kann
Ich möchte APG4b mit Python lösen (Kapitel 2)
Ich möchte die Produkte verkaufen, die ich durch Python Scraping Mercari aufgelistet habe
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 2/3
Ich möchte leicht einen leckeren Laden finden
Ich möchte C ++ - Code aus Python-Code erstellen!
Ich möchte den Fortschritt in Python anzeigen!
Ich möchte eine Django-App auf Heroku hochladen
Ich möchte eine schöne Python-Entwicklungsumgebung für meinen neuen Mac erstellen
Ich möchte nur scipy hinzufügen, aber es ist ein lustiges Memo. Ubuntu, Python 3.
Ich möchte eine Prioritätswarteschlange erstellen, die mit Python (2.7) aktualisiert werden kann.
Ich habe versucht zu erklären, wozu der Python-Generator so einfach wie möglich ist.
Ich möchte ein Programm ausführen und verteilen, das die Größe von Bildern in Python3 + Pyinstaller ändert