私はPythonで次のことを達成する方法を疑問に思っていました:
for( int i = 0; cond...; i++)
if cond...
i++; //to skip an run-through
運よくこれを試しました。
for i in range(whatever):
if cond... :
i += 1
Pythonのforループは異なります。 i
は、ループを通過するたびに次の値に再割り当てされます。
以下は、C++が行っていることのリテラルバージョンを取得しているため、必要な処理を行います。
i = 0
while i < some_value:
if cond...:
i+=1
...code...
i+=1
その理由は次のとおりです。
c ++では、次のコードセグメントは同等です。
for(..a..; ..b..; ..c..) {
...code...
}
そして
..a..
while(..b..) {
..code..
..c..
}
一方、python forループは次のようになります。
for x in ..a..:
..code..
になる
my_iter = iter(..a..)
while (my_iter is not empty):
x = my_iter.next()
..code..
現在の反復をスキップして次の反復に進むcontinue
キーワード(およびすべてのループ反復をスキップしてループを終了するbreak
キーワード)があります。
for i in range(10):
if i % 2 == 0:
# skip even numbers
continue
print i
イテレータを明示的にインクリメントできます。
whatever = iter(whatever)
for i in whatever:
if cond:
whatever.next()
Condが最後の要素でTrueになる可能性がある場合は、StopIterationをキャッチする必要があります。
リスト内の要素を繰り返し処理しているのであって、数字を繰り返し処理しているのではないことに注意してください。
たとえば、次のことを考慮してください。
for i in ["cat", "dog"]:
print i
そこでi + 1を実行するとどうなりますか?リストの次の要素をスキップしない理由がわかりました。
実際にすべての値を反復処理する代わりに、反復処理するリスト内に含まれるものを調整することもできます。
例:
r = range(10)
for i in filter(lambda x: x % 2 == 0, r):
print i
また、for本体を2つに分割することもできます。最初の部分はcontinue
を使用して次の要素にスキップし、スキップしなかった場合は2番目の部分がアクションを実行します。
これには、達成しようとしているタスクに応じて、別のアプローチがあります。 cond
が完全にループしている入力データの関数である場合、次のようなものを試してみてください。
def check_cond(item):
if item satisfies cond:
return True
return False
for item in filter(check_cond, list):
...
これは、C#3.0+のLINQのように、これを行うための関数型プログラミングの方法です。 Pythonic(しばらくの間、Guido van Rossumはフィルターを削除し、マップし、Python 3)から減らしたいと思っていましたが、それは確かにエレガントで、私がやる方法でした。 。
簡単に「次のレッグをスキップ」することはできません(もちろん、thisレッグをcontinue
でスキップできます)。あなたが本当に主張するなら、あなたは補助的なbool
でそれを行うことができます。
skipping = False
for i in whatever:
if skipping:
skipping = False
continue
skipping = cond
...
または、補助的なint
を使用して一般化する場合:
skipping = 0
for i in whatever:
if skipping:
skipping -= 1
continue
if badcond:
skipping = 5 # skip 5 legs
...
ただし、このような複雑なループロジックを適切なジェネレーターにカプセル化することをお勧めします-希望するものについてもう少し具体的にできる場合を除き、例を挙げるのは困難です(おそらく、同じブール値cond
を追うのは本当に難しい;-)。
for i in filter(lambda x:x!=2,range(5)):