キーワード Pythonのfor文の構文は、次のようになっている。
for文はイテレータ iterator を駆動しているだけ。
オブジェクトは、 イテレイタは, for文は, イテレイタオブジェクトの 例:
Pythonでは, for文で変数スコープは導入されない. つまり, for文に入る前に変数が何らかの値を持っていた場合、単に代入により値が変わる。また、for文を抜けた後も、変数を使える。当然、最後に代入された値になっている。
一連の数字を代入して繰り返すには 0〜5ではないことに注意。
break文で、ループの途中で脱出できる。
continue文で、次の値で、ループのやり直しができる。
イテレータが 辞書クラスでも、同じことができる。
for文に与えるオブジェクトは, 型は問わないので、iterable を自作してもよい。
次の例は, ごく簡単な iterable とイテレイタ。二つを兼ねるようにして, クラスを分けずに なお、イテレイタで定義するのは もう少し意味のある例として、逆順イテレータを使って、リストを逆に辿ってみる。
イテレータを作ることで、コンテナの要素を様々な形で辿ることができる。
上の例でついでに書いたが、 これは、繰り返しではなくて、新しいリストを生成する。繰り返しじゃない。
これを、次のように書ける.
パッと見、そうとう不思議な構文。for文とはまったく関係がない。基本的な構文は次のようになる
この構文は、リストだけでなく、集合 'set', 辞書 'dict', ジェネレイタの生成にも使える。
リスト、セット、辞書の内包表記は、この式を評価したときに, すべて展開される。リストを作りきってしまう。
もし,「リスト」が欲しいのではなく、要素の値が順番に得られれば十分なのなら、ジェネレイタを作るようにすべき。ジェネレイタの場合は、この式を評価したときには、実行されない。
forで生成した系列のうち、条件に合う場合のみ要素を生成する。
「 飛び飛びではなく, 要素を生成するが, その値の生成式を変えたい場合は次のように書く。
これは後置ifの構文に似ている。ただし、Pythonの 同じことをするのに, 後置ifを使えば次のように書き換えられる.
リスト内包表記のforつながりで、for文とリスト内包表記について, 突っ込んで解説する。
_for文
for 変数 in オブジェクト
:
繰り返す処理1
繰り返す処理2
...
__iter__ メソッドを持つものであれば, 型はなんでもいい。リストなどのコンテナか、イテレイタオブジェクト、ジェネレイタを与える。これら __iter__()を持つオブジェクトは Python 界隈では iterable と呼ばれる.
__iter__()メソッドはイテレイタを返すように実装する約束。for文は, 最初に, オブジェクトの __iter__() メソッドを呼び出し、イテレイタオブジェクトを得る。オブジェクトがコンテナなら新しいイテレイタ、オブジェクトがまさにイテレイタなら、自分自身。
__next__() メソッドを呼び出す度に、何らかの順序で値を返す。終端に達した場合は StopIteration 例外を投げる。
__next__()の値を変数に代入し、ブロックの文を実行するのを繰り返す。
ja
2
3.0
range() を使う。ここで、古い解説では xrange() を使っているページもあるが, xrange() はすでに廃れている。
0
1
2
3
4
range()は次のいずれかの引数を取る。
range( stop )
range( start, stop [, step] )
break文
0
1
2
3
4
5
continue文
1 奇数
3 奇数
5 奇数
7 奇数
9 奇数
二つの値を得る
__next__()の戻り値としてタプル tuple を返す場合、for文で複数の変数に値を入れて、ループできる。
0 : red
1 : greeen
2 : blue
3 : yellow
1
2
1 hoge
2 fuga
_イテレイタ
__iter__() で自分自身を返すようにしてもよい。
next() ではない。それはすでに廃れた。
2
1
0
逆順イテレータ
9
7
5
3
1
[9, 7, 5, 3, 1]
listの構築子 constructor の引数としてイテレータを与えると、そのイテレータの順で新しいリストを作ることができる。
_リスト内包表記
forキーワードが使われる構文として, リスト内包表記 list comprehensions がある。
[ 式 for 変数 in オブジェクト ]
リストだけではない
{ 式 for 変数 in オブジェクト }
{ キー式: 値式 for k,v in オブジェクト }
( 式 for 変数 in オブジェクト )
条件により要素を生成しない
if 条件式」までが一式。これも、if文とは関係なく, 特別な構文になっている。後置ifの構文ではない.
[0, 2, 4, 6, 8]
要素の生成式を選ぶ
[ then節の式 if 条件式 else 式 for文 ] となる。ifがあっち行ったりこっち行ったり。
[0, '100', 2, '300', 4, '500', 6, '700', 8, '900']
ifは式ではなく文なので、後置ifそのものではない。
ネストしたfor
forは複数書ける。右側に書いたものが内側のループになる。ifも使える。
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
[1, 2, 3, 4, 5, 6, 7, 8, 9]