for 文は、シーケンス (文字列、タプルまたはリスト) や、その他の 反復可能なオブジェクト (iterable object) 内の要素に渡って反復処理を 行うために使われます:
for_stmt | ::= | "for" target_list "in" expression_list ":" suite |
["else" ":" suite] |
式リストは一度だけ評価されます; 結果はイテレーション可能オブジェクト
にならねばなりません。expression_list
の結果に対してイテレータ
を生成し、その後、シーケンスの各要素についてインデクスの小さい順に
一度だけスイートを実行します。
このときシーケンス内の要素が通常の代入規則を使ってターゲットリスト
に代入され、その後スイートが実行されます。全ての要素を使い切ると
(シーケンスが空の場合にはすぐに)、 else 節があればそれが
実行され、ループを終了します。
最初のスイート内で break 文が実行されると、else 節の スイートを実行することなくループを終了します。 continue 文が最初のスイート内で実行されると、 スイート内にある残りの文の実行をスキップして、式の真偽評価に戻ります。
スイートの中では、ターゲットリスト内の変数に代入を行えます; この代入によって、次に代入される要素に影響を及ぼすことはありません。
ループが終了してもターゲットリストは削除されませんが、シーケンスが
空の場合には、ループでの代入は全く行われません。
ヒント: 組み込み関数 range() は、
Pascal 言語における for i := a to b do
の効果を
エミュレートするのに適した数列を返します;
すなわち、 range(3)
はリスト [0, 1, 2]
を返します。
警告: ループ中のシーケンスの変更には微妙な問題があります (これは 変更可能なシーケンス、すなわちリストで起こります)。 どの要素が次に使われるかを追跡するために、内部的なカウンタが 使われており、このカウンタは反復処理を行うごとに加算されます。 このカウンタがシーケンスの長さに達すると、ループは終了します。 このことは、スイート中でシーケンスから現在の (または以前の) 要素を 除去すると、(次の要素のインデクスは、すでに取り扱った要素の インデクスになるために) 次の要素が飛ばされることを意味します。 同様に、スイート中でシーケンス中の現在の要素以前に要素を挿入すると、 ループ中で現在の要素が再度扱われることになります。 こうした仕様は、厄介なバグになります。シーケンス全体に相当するスライスを 使って一時的なコピーを作ると、これを避けることができます。
for x in a[:]: if x < 0: a.remove(x)
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。