Wenn Sie eine Liste/Tupel/Sequenz durchlaufen, können Sie mit len(...)
ermitteln, wie oft die Schleife ausgeführt wurde. Wenn Sie jedoch einen Iterator durchlaufen, können Sie dies nicht tun.Python-Idiom zum Zählen der Schleifenausführung
[Update für Klarheit: Ich denke über endliche Iteratoren für den einmaligen Gebrauch, wo ich Berechnungen auf den Elementen UND zählen sie gleichzeitig durchführen möchte.]
ich derzeit eine explizite Zählervariable wie im folgenden Beispiel verwenden:
def some_function(some_argument):
pass
some_iterator = iter("Hello world")
count = 0
for value in some_iterator:
some_function(value)
count += 1
print("Looped %i times" % count)
Da gibt es 11 Zeichen in "Hello world"
, die erwartete Ausgabe ist hier:
Looped 11 times
Ich habe berücksichtigte auch diese kürzere Alternative mit enumerate(...)
, aber ich finde das nicht so klar:
def some_function(some_argument):
pass
some_iterator = iter("Hello world")
count = 0 # Added for special case, see note below
for count, value in enumerate(some_iterator, start=1):
some_function(value)
print("Looped %i times" % count)
[Update als Referenz: @mata entdeckte, dass dieses zweite Beispiel wie ursprünglich geschrieben fehlschlagen würde, wenn der Iterator leer ist. Das Einfügen von count = 0
löst das, oder wir können die for ... else ...
Struktur verwenden, um dieses Eckgehäuse zu verarbeiten.]
Es verwendet nicht den Index von enumerate(...)
innerhalb der Schleife, sondern die Variable auf den Loop-Count einzustellen, ist fast ein Nebeneffekt. Für mich ist das ziemlich unklar, deshalb bevorzuge ich die erste Version mit dem expliziten Inkrement.
Gibt es eine akzeptierte Pythonic-Methode (ideal für Python 3 und Python 2)?
Ja, und diese Lösung ist "enumerate". Warum halten Sie es nicht für "klar"? Ich weiß nicht, ob es daran gewöhnt ist, sich daran zu gewöhnen, aber 'enumerate 'scheint mir lesenswert und prägnant zu sein ... – schwobaseggl
Es kommt darauf an ... Ich würde sagen, dass die zweite Form mehr Python ist, aber auch deckt nicht genau den gleichen Fall ab, denn wenn der Iterator keine Elemente "count" hat, nachdem die Schleife nicht definiert wurde und Sie einen NameError erhalten, dann müssten Sie einen 'for ... else' verwenden oder den Zähler initialisieren vor der Schleife. – mata
Guter Punkt @mata, wenn der Iterator leer war, wird das zweite Beispiel wie beschrieben fehlschlagen. – peterjc