ループの繰り返し数をどこにも格納せずに、特定の数の操作を実行できるかどうか疑問に思っていました。
たとえば、2つの"hello"
メッセージをコンソールに出力したいとします。今私はできることを知っています:
for i in range(2):
print "hello"
しかし、その後i
変数は0
および1
の値を取ります(実際には必要ありません)。これらの不要な値をどこにも保存せずに同じことを達成する方法はありますか?
未使用の変数のイディオム(他の多くの言語で共有されている)は、単一のアンダースコア_
。コードアナライザーは通常、_
は未使用であり、プログラマはそれがi_dont_care_wtf_you_put_here
。 PythonのZenが言うように、「特殊なケースは規則を破るほど特別ではない」というように、アイテム変数を持たずに反復する方法はありません。
exec 'print "hello";' * 2
動作するはずですが、私はそれを考えて恥ずかしいです。
更新:ちょうど別のものを考えた:
for _ in " "*10: print "hello"
質問であなたが提供したforloopはそれと同じくらい良いと思いますが、割り当てられなければならない未使用の変数は_
という名前の変数に割り当てることができることを指摘したいと思います割り当てられた値を「破棄」します。 _
参照には指定した値が保持されますが、コードリンターや他の開発者は、その参照を使用していないことを理解します。以下に例を示します。
for _ in range(2):
print('Hello')
他の人は、for
ループ内の反復変数を完全に回避できないことに対処していますが、作業量をわずかに減らすオプションがあります。 range
は結局、大量の数字を生成する必要があり、これにはわずかな作業が含まれます。それさえも避けたい場合は、 _itertools.repeat
_ を使用して、同じ(無視された)値を繰り返し取得することができます。これには、異なるオブジェクトの作成/取得は含まれません。
_from itertools import repeat
for _ in repeat(None, 200): # Runs the loop 200 times
...
_
これはfor _ in range(200):
よりもマイクロベンチマークで高速に実行されますが、ループ本体が意味のある作業を行う場合、それはバケツに落ちています。ループの反復可能な匿名シーケンスを乗算するのとは異なり、repeat
のセットアップコストはわずかで、長さに依存するメモリオーバーヘッドはありません。
私はデルナンの答えに完全に同意しますが、不可能ではありません。
loop = range(NUM_ITERATIONS+1)
while loop.pop():
do_stuff()
ただし、これは任意のリストでは機能しないことに注意してください。リストの最初の値(最後にポップされた値)がFalse
に評価されない場合、次のパスで別の反復と例外が発生します。 :IndexError: pop from empty list
。また、ループの後、リスト(loop
)は空になります。
好奇心のためだけに。 ;)
簡単にできます
print 2 * 'hello'
申し訳ありませんが、任意の言語のPythonおよび英語を含む)を反復処理するには、インデックスを保存する必要があります。変数に格納するかどうかを指定します。 pythonはforループが内部的に追跡されているため、実際には変更されません。そのままにしておくことをお勧めします。
i
...を保存せずに「hello」を3回出力します.
[print('hello') for i in range(3)]
for Word in ['hello'] * 2:
print Word
それは慣用的なPythonではありませんが、あなたがやろうとしていることでもありません。