Wie kann ich begrenzen Iterationen einer Schleife in Python Stack-Überlauf
naive Implementierung
Der Python naïf aus anderen Sprachen kommen wahrscheinlich diesen perfekt gewartet und performanten (wenn unidiomatic) Code schreiben würde:
Mehr idiomatische Implementierung
Aber Python hat aufzuzählen, die gut über die Hälfte dieser Code subsumiert:
Deshalb haben wir uns über den zusätzlichen Code in zwei Hälften geschnitten. Aber es muss doch einen besseren Weg geben.
Wenn enumerate eine weitere optionale Stopp Argument nahm (zum Beispiel, dauert es eine Startargument wie folgt aus: aufzuzählen (Artikel, start = 1)), das wäre, glaube ich, ideal sein, aber die unten nicht existiert (in der Dokumentation sehen enumerate Hier ):
Beachten Sie, dass es keine Notwendigkeit, den Index zu nennen, weil es keine Notwendigkeit, es zu verweisen ist.
Gibt es einen idiomatischen Weg, um die oben zu schreiben? Wie?
Eine zweite Frage: Warum wird das nicht in enumerate gebaut?
Gibt es einen kürzeren, idiomatischen Weg, um die oben zu schreiben? Wie?
Einschließlich der Index
zip stoppt auf dem kürzesten iterable ihrer Argumente. (Im Gegensatz zu dem Verhalten von zip_longest. Die die längsten iterable verwendet.)
So können wir ein Range-Objekt (mit seinem Anschlag Argumente) passieren zip und es wie eine begrenzte Aufzählung zu verwenden.
zip (Bereich (Limit), Artikel)
Verwendung Python 3, zip und Range Iterables Rückkehr, die Pipeline werden die Daten, anstatt die Daten in Listen für Zwischenschritte zu materialisieren.
Um das gleiche Verhalten in Python 2 zu erhalten, ersetzt nur xrange für Reichweite und itertools.izip für Reißverschluss.
Wenn der Index nicht erforderlich, itertools.islice
Sie können itertools.islice verwenden:
die erfordert nicht den Index zugewiesen wird.
Die oben wäre weniger performant für diejenigen, die bereits mit aufzählen, denn es würde prüfen, ob es Zeit ist, jede Iteration zu stoppen. Wir können einfach überprüfen und die alte enumerate verwenden, wenn kein Stopp Argument bekommen:
Diese zusätzliche Überprüfung würde eine leichte vernachlässigbare Auswirkungen auf die Leistung haben.
Wie, warum enumerate wurde kein Stopp Argument haben diese ursprünglich vorgeschlagen (siehe PEP 279):
Diese Funktion wurde ursprünglich mit optionalem Start- und Stopp-Argumenten vorgeschlagen. GvR [Guido van Rossum] darauf hingewiesen, dass der Funktionsaufruf Aufzählen (SEQN, 4, 6) hatte eine alternative, plausible Interpretation als eine Scheibe, die die vierten und fünften Elemente der Folge zurückkehren würde. Um die Zweideutigkeit zu vermeiden wurden, sind die optionalen Argumente fallen gelassen, obwohl es Flexibilität als Schleifenzähler gemeint zu verlieren. Diese Flexibilität war sehr wichtig für den gemeinsamen Fall von einem Zählen, wie in:
So offenbar wurde beginnen gehalten, weil es sehr wertvoll war, und Anschlag fällt gelassen wurde, weil es wenige Anwendungsfälle hatte und trug zur Verwirrung über die Nutzung der neuen Funktion.
Ich würde davon ausgehen, dass jetzt die Python-Gemeinschaft die Verwendung von enumerate weiß, würde die Verwirrung Kosten durch den Wert des Arguments aufgewogen werden.
Bis zu diesem Zeitpunkt können Sie:
oder, wenn Sie den Index nicht brauchen überhaupt: