Also, ich habe Raymond Hettinger's Talk Code in wunderschöne, idiomatische Python transformiert und er bringt dieses Formular zur Sprache von iter
was mir nie bewusst war. Sein Beispiel ist das folgende:
Anstelle von:
%Vor%Verwenden:
%Vor% Nach dem Überprüfen der Dokumentation von iter
habe ich ein ähnliches Beispiel gefunden:
Das sieht für mich ziemlich nützlich aus, aber ich frage mich, ob Pythonisten von Ihnen irgendwelche Beispiele dieses Konstrukts kennen, die keine I / O-Leseschleifen beinhalten. Vielleicht in der Standardbibliothek?
Ich kann an sehr konstruierte Beispiele denken, wie das Folgende:
%Vor%Aber offensichtlich ist das nicht nützlicher als die eingebauten Iterables. Außerdem scheint es für mich Code-Geruch zu sein, wenn Sie einer Funktion einen Status zuweisen. An diesem Punkt sollte ich wahrscheinlich mit einer Klasse arbeiten, aber wenn ich eine Klasse schreibe, kann ich das Iterator-Protokoll genauso gut für alles implementieren, was ich erreichen möchte.
In der Regel beinhalten die Hauptverwendungen, die ich für zwei Argumenten gesehen habe, das Konvertieren von Funktionen, die C-APIs (impliziter Zustand, kein Iterationskonzept) ähneln, zu Iteratoren. Dateiähnliche Objekte sind ein häufiges Beispiel, aber es zeigt sich in anderen Bibliotheken, die C-APIs schlecht wickeln. Das Muster, das Sie erwarten würden, wäre eins in APIs wie FindFirstFile
/ FindNextFile
, wo eine Ressource geöffnet wird, und jeder Aufruf setzt den internen Status fort und gibt einen neuen Wert oder eine Markervariable zurück (wie NULL
in C) . Es ist normalerweise am besten, es in einer Klasse zu implementieren, die das Iteratorprotokoll implementiert, aber wenn Sie es selbst machen müssen, während die API ein C-Level ist, kann das Wrapping die Verwendung verlangsamen, wobei zwei Argumente in C as implementiert werden Nun, kann die Kosten für zusätzliche Byte-Code-Ausführung vermeiden.
Andere Beispiele umfassen veränderbare Objekte, die während der Schleife selbst geändert werden, z. B. Schleifen in umgekehrter Reihenfolge über Zeilen in einem Bytearray, Entfernen der Zeile nur nach Abschluss der Verarbeitung:
%Vor% Ein weiterer Fall ist die progressive Verwendung von Slicing, z. B. eine effiziente (wenn auch hässliche) Möglichkeit, ein iterbares in Gruppen von n
-Elementen zu gruppieren, während die letzte Gruppe weniger als n
items if ist Die Eingabe iterable ist kein gleiches Vielfaches von n
in der Länge (diese habe ich tatsächlich verwendet, obwohl ich normalerweise itertools.takewhile(bool
anstelle von zwei arg iter
verwende):
Eine andere Verwendung: Mehrere gebeizte Objekte in eine einzelne Datei schreiben, gefolgt von einem Sentinel-Wert ( None
zum Beispiel), so dass Sie beim Abtrennen dieses Idiom verwenden können, anstatt sich irgendwie die Anzahl der gebeizten Elemente merken zu müssen muss load
immer wieder aufrufen bis EOFError
:
Hier ist ein dummer Fall, den ich mir ausgedacht habe:
%Vor%Beispielausgabe:
%Vor%Die Idee ist, einen Generator zu haben, der zufällige Werte liefert, und Sie wollen einen Prozess, sobald ein bestimmter Wert ausgewählt wurde. Sie könnten z.B. Verwenden Sie dieses Muster in jedem Durchlauf einer Simulation, die versucht, das durchschnittliche Ergebnis eines stochastischen Prozesses zu bestimmen.
Natürlich wäre der Prozess, den Sie modellieren würden, wahrscheinlich unter der Haube viel komplizierter als ein einfacher Würfelwurf ...
Ein weiteres Beispiel, das ich mir vorstellen kann, wäre das wiederholte Ausführen einer Operation bis zum Erfolg, angezeigt durch eine leere Fehlermeldung (nehmen wir hier an, dass einige Funktionen von Drittanbietern so gestaltet sind, anstatt beispielsweise Ausnahmen zu verwenden):
%Vor%Tags und Links python