web-dev-qa-db-ja.com

反復数をどこにも保存せずに特定の回数反復する

ループの繰り返し数をどこにも格納せずに、特定の数の操作を実行できるかどうか疑問に思っていました。

たとえば、2つの"hello"メッセージをコンソールに出力したいとします。今私はできることを知っています:

for i in range(2):
    print "hello"

しかし、その後i変数は0および1の値を取ります(実際には必要ありません)。これらの不要な値をどこにも保存せずに同じことを達成する方法はありますか?

44
BorrajaX

未使用の変数のイディオム(他の多くの言語で共有されている)は、単一のアンダースコア_。コードアナライザーは通常、_は未使用であり、プログラマはそれがi_dont_care_wtf_you_put_here。 PythonのZenが言うように、「特殊なケースは規則を破るほど特別ではない」というように、アイテム変数を持たずに反復する方法はありません。

46
user395760
exec 'print "hello";' * 2

動作するはずですが、私はそれを考えて恥ずかしいです。

更新:ちょうど別のものを考えた:

for _ in " "*10: print "hello"
15
recursive

質問であなたが提供したforloopはそれと同じくらい良いと思いますが、割り当てられなければならない未使用の変数は_という名前の変数に割り当てることができることを指摘したいと思います割り当てられた値を「破棄」します。 _参照には指定した値が保持されますが、コードリンターや他の開発者は、その参照を使用していないことを理解します。以下に例を示します。

for _ in range(2):
    print('Hello')
10
ThorSummoner

他の人は、forループ内の反復変数を完全に回避できないことに対処していますが、作業量をわずかに減らすオプションがあります。 rangeは結局、大量の数字を生成する必要があり、これにはわずかな作業が含まれます。それさえも避けたい場合は、 _itertools.repeat_ を使用して、同じ(無視された)値を繰り返し取得することができます。これには、異なるオブジェクトの作成/取得は含まれません。

_from itertools import repeat

for _ in repeat(None, 200):  # Runs the loop 200 times
    ...
_

これはfor _ in range(200):よりもマイクロベンチマークで高速に実行されますが、ループ本体が意味のある作業を行う場合、それはバケツに落ちています。ループの反復可能な匿名シーケンスを乗算するのとは異なり、repeatのセットアップコストはわずかで、長さに依存するメモリオーバーヘッドはありません。

5
ShadowRanger

私はデルナンの答えに完全に同意しますが、不可能ではありません。

loop = range(NUM_ITERATIONS+1)
while loop.pop():
    do_stuff()

ただし、これは任意のリストでは機能しないことに注意してください。リストの最初の値(最後にポップされた値)がFalseに評価されない場合、次のパスで別の反復と例外が発生します。 :IndexError: pop from empty list。また、ループの後、リスト(loop)は空になります。

好奇心のためだけに。 ;)

4
Walter

簡単にできます
print 2 * 'hello'

1
sairam546

申し訳ありませんが、任意の言語のPythonおよび英語を含む)を反復処理するには、インデックスを保存する必要があります。変数に格納するかどうかを指定します。 pythonはforループが内部的に追跡されているため、実際には変更されません。そのままにしておくことをお勧めします。

1
user3399731

i...を保存せずに「hello」を3回出力します.

[print('hello') for i in range(3)]
1
Rasmus Pedersen
for Word in ['hello'] * 2:
    print Word

それは慣用的なPythonではありませんが、あなたがやろうとしていることでもありません。

0
nmichaels