for文の構文
for文の構文は以下になります。忘れがちなのが右端のコロン(:)です。
1 2 3 4 |
for 変数 in ループ条件: 処理 処理 ・・・ |
ループ条件の書き方には、range関数、リスト、タプル、辞書、など何通りかありますので以下に説明します。
そもそもfor文は何に使うのか
for文の説明の前に、そもそもfor文とは何に使うのかを分からない方へ、簡単な説明をします。ループとfor文の意味を知っている方は、後述のfor文の構文説明を見てください。
プログラムの中で同じ処理を何度も繰り返して行うことがあります。
例えば、以下のプログラムはprint関数を使って1から4までの数値を出力します。
1 2 3 4 |
print(1) print(2) print(3) print(4) |
同じ処理の数が増えてくると、プログラムの行数がどんどん増えていきます。
このような、同じ処理を繰り返し行うことが決まっている処理の場合には、for文を利用して繰り返しの処理部分をループ処理で置き換えることで、同じ処理を何度も書く必要がなくなります。
以下がfor文を使って書き直したコードです。
1 2 |
for i in range(1, 5): print(i) |
実行結果
1
2
3
4
range関数を使って、0から4(関数の設定値は1と5)までを繰り返し処理します。range関数の詳細は後述しています。
このように、for文を使うことで、変化する値の部分をfor文が担当し、繰り返しの処理部分を1つにまとめて書くことが出来るようになります。
for文の処理部分の範囲
for文は、for文自身がある行と、インデントされた処理部分の行に分かれます。
同じ階層のインデントであればfor文のブロックとみなされます。
インデントが元の位置に戻った個所が出現すると、それ以降はfor文ブロックではなくなります。
1 2 3 4 5 |
for文: 処理 処理 処理 # ここまでがfor文ブロックになる 処理 # インデントが戻ったためここはfor文ブロックではない |
for文の右端にはコロン(:)を付けます。
同じfor文のブロックで処理行のインデントがさらに深いインデントになってり場合はインデント不正のエラーになります。
1 2 3 4 |
for文: 処理 処理 処理 # ここはインデントが不正のためエラー |
for文の中のfor文
for文のブロックの中に別のfor文ブロックを書くことが出来ます。
1 2 3 4 5 6 |
for文: 処理 処理 for文: 処理 処理 |
実際のコードで書くと以下のようになります。
1 2 3 4 5 6 |
for i in range(3): print(i) for ii in range(3): print(ii) for iii in range(3): print(iii) |
繰り返す回数の書き方
for文のinの右に書く繰り返し回数の書き方には、大きく分けると4種類の方法があります。
- range関数を使う方法
- リストやタプルを使う方法
- インデックスと値を使う方法
- 辞書を使う方法
1. range関数を使う方法
繰り返し回数をrange関数を使って指定し、range関数の範囲にある値を格納する変数を使って指定します。
1 |
for 変数 in range(繰り返し回数): |
range関数には3つの引数を渡すことが出来ます。
range(開始番号, 終了番号, 増減数)
1番目の開始番号と3番目の増減数は省略可能で、開始番号を省略した場合は0が開始番号となり、増減数を省略した場合は1ずつ増加します。
2番目の終了番号の直前までの値が結果として利用されます。
増減数がプラスの場合は「1番目の開始番号 ≦ i < 2番目の終了番号」の条件でループします。増減数がマイナスの場合は「1番目の開始番号 ≧ i > 2番目の終了番号」と不等号の向きが逆になります。
以下は開始番号と増減数を省略して、0から2までをループする書き方です。
1 2 |
for i in range(3): print(i) |
実行結果
0
1
2
一般的には1ずつ加算するプログラムが多いですが、1ずつ減算するようなコードもrange関数で指定することが出来ます。
1 2 |
for i in range(1, -3, -1): print(i) |
実行結果
1
0
-1
-2
2. リストやタプルを使う方法
ループの対象をリストやタプルを使って指定します。
1 |
for 変数 in リストやタプル: |
for文の繰り返し回数としてリストやタプルを設定すると、リストやタプルに格納済みの値の先頭から最後までをループして変数に代入します。
リストやタプルをfor文で使用しても、参照するだけリストやタプルの内容は変わりません。
1 2 3 4 5 6 7 |
list = ['a', 'b', 'c'] for s in list: print(s) tpl = ('A', 'B', 'C') for s in tpl: print(s) |
実行結果
a
b
c
A
B
C
3. インデックスを使う方法
リストやタプルや辞書などを使ったループの場合、設定されている値を変数に代入してそれを使うことが出来ますが、リストやタプルや辞書自体の何番目(インデックス)の値のループなのかを知りたい場合があります。
例えば、[‘A’, ‘B’, ‘C’, ‘D’] のリストの値’A’のインデックスは0、値’B’のインデックスは1、といった感じです。
for文のin句の右でenumerate関数を使うと、リストやタプルや辞書などに含まれる値だけでなく、現在ループ中のインデックスも一緒に取得することが出来ます。
インデックス番号を何番から開始したいかを指定する場合は、enumerate関数の2番目の引数の「開始番号」に指定します。省略時は0になります。通常はインデックス番号は0から始まるため、特に必要がなければ開始番号は省略して構いません。
1 |
for インデックス変数, 値変数 in enumerate(リストやタプルや辞書など, [開始番号]): |
以下は3つの文字列が設定されているタプルを先頭から順にインデックス番号と値を出力するサンプルです。
1 2 3 |
tpl = ('A', 'B', 'C') for i, s in enumerate(tpl): print(i, s) |
実行結果
0 A
1 B
2 C
用途は限られますが、enumerate関数の引数に辞書を使うこともできます。辞書の場合はキーがありますが、enumerate関数で取得できるインデックスはキーとは異なります。
1 2 3 |
dic = {'a':1, 'b':2, 'c':3, 'd':4} for i, key in enumerate(dic): print(i, key) |
実行結果
0 a
1 b
2 c
3 d
4. 辞書を使う方法
辞書からすべてのキーと値を取得するには、辞書のitems()メソッドをfor文と組み合わせて使用します。
1 |
for キー変数, 値変数 in 辞書.items(): |
辞書をすべてループして、キーとインデックスを出力するサンプルです。
1 2 3 |
dic = {'a':1, 'b':2, 'c':3, 'd':4} for i, key in dic.items(): print(i, key) |
実行結果
a 1
b 2
c 3
d 4