Pythonでfor文を使うための初心者向けの解説です。
for文はループ処理を行いたいときに使います。
for文で使えるもの――配列・集合・辞書・文字列のfor文での挙動を確認します。
いっしょに使うと便利なrange関数、enumerate関数、for文での途中での抜け方、elseを使うには、を解説しました。
基本文型
for文を使うための基本的な文型は次のようになります。
for 変数 in オブジェクト:
処理
オブジェクトには、配列・集合・辞書・文字列などが置かれます。
では各種オブジェクトを置いた場合の挙動を確認していきましょう。
配列
for文で配列(リスト・タプル)を置いた場合、ひとつずつ順番に変数に入れられます。
>>> fruits = ('apple', 'orange', 'peach') >>> for i in fruits: ... print(i) ... apple orange peach
上記はタプルで使用しましたが、リストでやっても動作は同じです。
集合
集合の場合、ひとつずつ取り出されます。
seasons = {'spring', 'summer', 'fall', 'winter'} >>> for i in seasons: ... print(i) ... fall summer winter spring
結果を見てみると配列と違い、順序はバラバラです。
辞書
辞書のときには、キーが順に取り出されます。
>>> test = {'math': 76, 'english': 63, 'japanese': 91} >>> for i in test: ... print(i) ... math english japanese
文字列
文字列は一文字ずつ取り出されます。
>>> for i in 'Python': ... print(i) ... P y t h o n
使用できるオブジェクト
この項は捕捉です。
for文のオブジェクトに置けるものは、もう少し具体的に言うと、属性の「__iter__」を持つものです。
属性をリストとして表示するdir関数を使って確認します。
>>> seasons
{'fall', 'summer', 'winter', 'spring'}
>>> dir(seasons)
['__and__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__init_subclass__', '__ior__', '__isub__', '__iter__', ...]
後で紹介しますが、for文とセットでよく使うrange関数にも「__iter__」が備わっています。
>>> dir(range(10))
['__bool__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', ...]
合わせてよく使う関数
for文と合わせてよく使う関数があります。
range関数とenumerate関数です。
rangeは、複数回繰り返したいときや、規則的に増減する数値が欲しいときに使用します。
enumerateは、オブジェクトのインデックスが必要なときに使います。
range関数
- 複数回繰り返す
range(回数)
rangeの引数にfor文で繰り返したい回数を置くと、for文の処理をその回数分おこないます。
>>> for _ in range(3):
... print('Hello')
...
Hello
Hello
Hello
- 規則的に増減する数値が欲しいとき
range(スタート, ストップ, ステップ)
スタートの数からはじまり、ステップ数ずつ増加し、ストップまで数値が作成されます。
ストップの数そのものは含まれません。
>>> for i in range(1, 5, 1):
... print(i)
...
1
2
3
4
上記は、スタートの1からはじまり、ステップの1ずつ増加して、4で止まっています。
ストップである5は含まれません。
ステップ数にマイナスを渡すことで、減少させることができます。
>>> for i in range(10, -1, -2):
... print(i)
...
10
8
6
4
2
0
10から2ずつ減少していますね。
スタートとステップは省略可能です。
省略した場合、スタートのデフォルト値は0、ステップのデフォルト値は1が採用されます。
>>> for i in range(1, 10):
... print(f'1 * {i} = {1*i}')
...
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
1 * 4 = 4
1 * 5 = 5
1 * 6 = 6
1 * 7 = 7
1 * 8 = 8
1 * 9 = 9
ステップを省略しました。
デフォルトの1ずつ増加しています。
>>> list(range(5)) [0, 1, 2, 3, 4]
range(5)をリストに変換してみると[0, 1, 2, 3, 4]となります。
enumerate関数
for文で配列を使うときなど、そのインデックスが合わせて欲しいときがあります。
そんなときに使う関数です。
for 変数1, 変数2 in enumerate(オブジェクト):
forの後に置く変数を2つ用意します。
変数1がインデックス用、2がオブジェクト用です。
>>> fruits = ('apple', 'orange', 'peach')
>>> for i, fruit in enumerate(fruits):
... print(f'{i}番目は{fruit}です')
...
0番目はappleです
1番目はorangeです
2番目はpeachです
条件文(if)とも合わせて使うことが多いです。
>>> fruits = ('apple', 'orange', 'peach') >>> for i, fruit in enumerate(fruits): ... if i == 0: ... print(f'ひとつめは{fruit}です。') ... elif i == 1: ... print(f'ふたつめは{fruit}です。') ... else: ... print(f'みっつめは{fruit}です。') ... ひとつめはappleです。 ふたつめはorangeです。 みっつめはpeachです。
途中での抜け方
for文を使っていると、条件に合致したときに途中で抜けたくなるときがあります。
そんなときには条件文のなかでbreakを使います。
>>> test = [50, 13, 100, 44, 72]
>>> for i in test:
... if i == 100:
... break
... print(i)
...
50
13
上記は、testを順番に取り出し、もし100があったらfor文から抜けるものです。
二重ループの内側でbreakに該当すると、抜けるのは内側のループだけになります。
>>> for i in range(1, 4):
... for j in range(1, 9):
... if j == 4:
... break
... print(f'{i} * {j} = {i*j}')
...
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
3 * 1 = 3
3 * 2 = 6
3 * 3 = 9
else節
Pythonではfor文にelseが使えます。
for 変数 in オブジェクト: 処理 else: 処理
else節はfor文が終わったら一度だけ処理を実行します。
breakで抜けたときには実行されません。
>>> sample = ('n', 'n', 'n') >>> for sample in samples: ... if sample == 'p': ... print('結果は陽性です。') ... break ... else: ... print('結果は陰性です。') ... 結果は陰性です。 >>> # breakで抜けたとき >>> samples = ('n', 'p', 'n') >>> for sample in samples: ... if sample == 'p': ... print('結果は陽性です。') ... break ... else: ... print('結果は陰性です。') ... 結果は陽性です。
for文のループが正常終了したらelseでの処理が実行され、breakで抜けたときにはelse節は実行されていません。
まとめ
- 文型
for 変数 in オブジェクト:
処理
- 複数繰り返し、規則的に増減する数値
range(回数)
range(スタート, ストップ,ステップ)
- インデックスを使う
enumerate(オブジェクト)
- else節
for 変数 in オブジェクト: 処理 else: 処理
途中で抜けたいときには条件文のなかでbreak
else節はbreakで抜けたときには実行されない。
このページが少しでもお役に立てたのなら幸いです。