だから私はこのようなことをしたい:
for i in range(5):
print(i);
if(condition==true):
i=i-1;
しかし、なんらかの理由で i をデクリメントしているのに、ループが気付かないようです。反復を繰り返す方法はありますか?
for
Python のループは常に前進します。後方に移動できるようにする場合は、次のような別のメカニズムを使用する必要がありますwhile
。
i = 0
while i < 5:
print(i)
if condition:
i=i-1
i += 1
またはさらに良い:
i = 0
while i < 5:
print(i)
if condition:
do_something()
# don't increment here, so we stay on the same value for i
else:
# only increment in the case where we're not "moving backwards"
i += 1
Python ループの使用range
は、C/C++/Java ループとは異なるように設計されていますfor
。反復ごとに、その間range(5)
に何をしても、 i は の次の値に設定さi
れます。
代わりに while ループを使用できます。
i = 0
while i<5:
print i
if condition:
continue
i+=1
しかし、正直なところ、私は一歩下がって、元の問題についてもう一度考えます. このようなループは常にエラーが発生しやすいため、おそらくより良い解決策が見つかるでしょう。for
Pythonループが異なるように設計されているのには理由があります。
Python のループについて誤解があります。ループは、ループのロジックとはまったく関係がないため、各反復でfor
何を行うかは気にしません。i
変更i
すると、ローカル変数が再バインドされるだけです。
期待どおりの動作を実現するには、while ループを使用する必要があります。ここでは、状態がi
ループの制御フローに影響します。
import random
i = 0
while i < 5:
print(i)
i += 1
if random.choice([True, False]):
i -= 1
range(5)
数字を含むリストを作成し0
ます4
- [0, 1, 2, 3, 4]
。
for ループを実行すると、リストを反復処理します。実行すると、リストの特定の要素の値i-= 1
が減少するだけで、反復が続行されます。
ここでの他の回答が示唆しているように、while
ループを使用する必要があります。
i= 0
while i<5:
# do stuff
if #condition:
i-= 1 # or +
i+= 1
他の多くの回答を繰り返しますが、完全を期すために、while loop
.
i = 0
while i < 5:
print(i)
if (not condition):
i+=1
ループ内の反復を (反復を繰り返すのではなく) 戻したい場合は、次のようにします。
i = 0
while i < 5:
print(i)
if (condition):
i -= 1
else:
i += 1
基本的に、while i < 5
各反復で評価し、チェックしますi < 5
。したがって、 を減らす/変更しないことi
で、次のような結果が得られます: (の値i
)
変わらない: 1->2->3-(condition satisfied)> 3 -> 4 -> 5
減分:1->2->3-(condition satisfied)>2 -> 3 -> 4 -> 5
i=i-1
for ループで反復を繰り返さない理由は単純です。for
ループでは、i
for ループの次の項目の値が割り当てられます。i
Python は、次のアイテムをそれに割り当てることができる限り、あなたが何をするかについてあまり気にしません。したがって、for ループfor i in <your_iterable>:<do whatever>
は次のようになります。
_i = 0
_length = len(<your_iterable>)
while _i < _length:
i = _i
_i += 1
<do whatever>
_
ただし、この類推では、述語変数 ( _i
, )にアクセスすることはできません_length
。これが、のロジックを単純化する方法ですfor loop
。何に割り当てられているかに関係なく、次の反復時に割り当てられ、ループは実際に何i
が割り当てられて_i
いるかを気にしないことに注意してくださいi
。
in
Python では、イテレータ (ループ内の後に続くものfor..in
) とそのコンシューマ (ループ内のコード)の間で双方向の交換を設定できます。これを実現するためsend
に、コンシューマー コードで を使用して、ジェネレーターに値を「注入」できます。あなたの場合、条件が満たされたときに現在の値を送り返し、range
送り返されたものを繰り返すジェネレーターで呼び出しをラップするだけです。わかりやすくするために意図的に冗長になっているコードを次に示します。
def repeateble(it):
buf, it = None, iter(it)
while True:
if buf is None:
# the buffer is empty, send them the next elem
val = next(it)
else:
# there's something in the buffer
# let's send that back
val = buf
# send the value and wait what they say
back = yield val
if back:
# they've sent us something!
# give them some dummy value as a result of send()
yield None
# and save what they've sent in a buffer
# for the next iteration
buf = back
else:
# they haven't sent anything
# empty the buffer
buf = None
from random import randint
# create a repeateble generator
rng = repeateble(range(100))
for x in rng:
print(x)
# check "some condition"...
if randint(1, 100) > 80:
print('repeat:')
# send the current value back to the generator
# it will be returned on the next iteration
rng.send(x)
while
ループを利用する:
i = 0
while i < 5:
print(i)
if condition:
i -= 1
i += 1
前述したように、これはどちらかというと一義的な Python です。おそらく、達成しようとしていることを投稿していただければ、より良いアドバイスを提供できるでしょう。