リスト/タプル/シーケンスをループする場合は、len(...)
を使用して、ループの実行回数を推測できます。しかし、イテレータをループするときはできません。ループ実行をカウントするためのPythonイディオム
[]明確にするために更新:私はアイテムの計算を行い、同時にそれらを数えたいと思う1回限りの有限イテレータについて考えています。]
私は現在、次の例のように、明示的なカウンタ変数を使用します。
が11の文字は、"Hello world"
である ここで予想される出力がある与えられた
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)
:
Looped 11 times
私が持っていますenumerate(...)
を使用してこの短い代替案を検討しましたが、わかりません:
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)
[]更新:@mataは、イテレータが空の場合、この2番目の例が最初に書かれたとおりに失敗することを発見しました。 count = 0
を挿入するとこれを解決するか、for ... else ...
構造を使用してこのコーナーケースを処理することができます。]
ループ内のインデックスはenumerate(...)
ではありませんが、変数をループカウントに設定することはほぼ副作用です。私にとっては、これはかなり不明なので、私は明示的なインクリメントの最初のバージョンを好みます。
Python 3とPython 2の両方のコードでこれを行うPythonの方法がありますか?
はい、この解決策は '列挙型です。なぜあなたはそれを「はっきりした」ものではないと考えますか?私はそれに慣れているのかどうか分かりませんが、「列挙する」はわかりやすいようです... – schwobaseggl
それは...私は2番目のフォームがもっとpythonicだと言いたいと思います。まったく同じケースをカバーしていません。なぜなら、反復子にループが定義されておらず、NameErrorを取得した後に 'count'要素がなければ、' for ... else'を使うか、カウンタを初期化するからですループの前に – mata
良い点@mata、イテレータが空の場合、書かれた2番目の例は失敗します。 – peterjc