31

だから私はこのようなことをしたい:

for i in range(5):
    print(i);
    if(condition==true):
        i=i-1;

しかし、なんらかの理由で i をデクリメントしているのに、ループが気付かないようです。反復を繰り返す方法はありますか?

4

8 に答える 8

40

forPython のループは常に前進します。後方に移動できるようにする場合は、次のような別のメカニズムを使用する必要があります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
于 2013-01-17T07:37:28.833 に答える
8

Python ループの使用rangeは、C/C++/Java ループとは異なるように設計されていますfor。反復ごとに、その間range(5)に何をしても、 i は の次の値に設定さiれます。

代わりに while ループを使用できます。

i = 0
while i<5:
    print i
    if condition:
        continue
    i+=1

しかし、正直なところ、私は一歩下がって、元の問題についてもう一度考えます. このようなループは常にエラーが発生しやすいため、おそらくより良い解決策が見つかるでしょう。forPythonループが異なるように設計されているのには理由があります。

于 2013-01-17T07:36:44.473 に答える
4

Python のループについて誤解があります。ループは、ループのロジックとはまったく関係がないため、各反復でfor何を行うかは気にしません。i変更iすると、ローカル変数が再バインドされるだけです。

期待どおりの動作を実現するには、while ループを使用する必要があります。ここでは、状態がiループの制御フローに影響します。

import random

i = 0
while i < 5:
    print(i)
    i += 1
    if random.choice([True, False]):
        i -= 1
于 2013-01-17T07:36:32.390 に答える
3

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
于 2013-01-17T07:45:10.243 に答える
3

他の多くの回答を繰り返しますが、完全を期すために、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-1for ループで反復を繰り返さない理由は単純です。forループでは、ifor ループの次の項目の値が割り当てられます。iPython は、次のアイテムをそれに割り当てることができる限り、あなたが何をするかについてあまり気にしません。したがって、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

于 2013-01-17T07:54:57.183 に答える
1

inPython では、イテレータ (ループ内の後に続くもの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)
于 2013-01-17T08:59:22.787 に答える
1

whileループを利用する:

i = 0
while i < 5:
    print(i)
    if condition:
        i -= 1
    i += 1

前述したように、これはどちらかというと一義的な Python です。おそらく、達成しようとしていることを投稿していただければ、より良いアドバイスを提供できるでしょう。

于 2013-01-17T07:36:53.780 に答える