Python の for 文による繰返し
処理を繰り返すためには、for や while を利用します。ここではそのうち for について説明します。
for 文によるループ
for はあるコレクション内の要素一つ一つに対して、繰り返し処理を行うものです。
Python では特定のコレクションの要素一つ一つに対して処理を行うため、もともと決まった数の繰り返し処理が行われます。 一方、他の多くの言語ではループを行うカウンターを用意して、繰り返し処理を行います。カウンターを使う方式では、カウンターを正しく更新しないと、繰り返し処理が終わらない(いわゆる無限ループ)になることがあります。
Python ではこうした問題が起こらない仕組みになっています。
早速 for によるループを見てみましょう。
次の例ではリスト L を作成しておき、それぞれの要素を取り出し、 それを x に代入し、出力しています。
L = ['Toyota', 'Nissan', 'Honda'] # リストを作成
for x in L:
print(x, end=", ")
実行結果は次のとおりです。確かにリスト内の文字列が表示されています。
Toyota, Nissan, Honda,
リストの範囲を: を用いて指定し、指定した範囲内の要素に対してループを行うこともできます。 次の例では [1:] と指定していますから、インデックス 0 の (1個目の) 要素をスキップして、最後の要素までを処理しています。
for x in L[1:]:
print(x, end=", ")
Nissan, Honda,
さて、ここまで見てきたように for を利用するには、あらかじめ特定のコレクションが必要です。 0, 1, 2, ... といった連番を用意したい場合はどうしたらよいでしょうか。
そのために、便利な関数があります。range です。 range 関数は引数で指定した値からリストを作成します。
次の例を見てください。
>>> print(*range(10))
0 1 2 3 4 5 6 7 8 9
>>> print(*range(5,10))
5 6 7 8 9
>>> print(*range(0,10,2))
0 2 4 6 8
ここではアスタリスクを使って、リストの内容を表示しています。詳しくは「アスタリスク (*) による List のアンパック」をみてください。
よって、range 関数を利用して、次のようにできます。
for i in range(5):
print(i, end=" ")
実行結果は次のようになります。5回 print(i) が呼ばれて数字が表示されています。
0 1 2 3 4
試しに、九九の掛け算の表を出力してみましょう。for を入れ子にします。
for i in range(1, 10):
for j in range(1, 10):
print(f"{i * j:>4d}", end="")
print() # 改行
出力結果は次のとおりです。
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
break 文で for ループから抜ける
for ループでは、指定したコレクションの要素全てについてループします。しかし、途中でループをやめて for ブロックから出ることもできます。 for ブロックを抜けるためには break と書きます。
for i in range(0, 10):
print(i, end=" ")
if i == 2: # i が 2 のとき
break # ループを抜ける
実行結果は次のようになります。
0 1 2
continue 文で for ブロックを中断してループを続ける
for ループは継続したいけど、特定の繰り返し時には処理を中断したい場合は continue 文を書きます。
次の例では、for ループで使うコレクションは 0 から 10 までの int のリストとして、要素をプリントします。 しかし、偶数の時だけ処理を行いません (要素をプリントしません)。
for i in range(0, 10):
if i % 2 == 0: # i が 2 で割切れるときは
continue # ここで中断。次のループへ。
print(i, end=" ")
念のために書くと、偶数の時だけ処理をスキップしたいなら、始めから奇数だけのコレクションでループした方が良いです。あくまでも continue を使うサンプルとしてみてください。
for i in range(1, 10, 2):
print(i, end=" ")
for の else とは?
さて、ここまでは C/C++ 言語や Java 言語など、他のプログラミング言語を利用していた人なら馴染みがあるとおもいますが、 ちょっと独特なものがあります。
それは for の else です。
for...else ステートメントは、for のコレクションの走査が完了したときに、 else で指定したステートメントブロックが実行される、というものです。
for i in range(3):
print(i, end=" ")
else:
print(f'[ELSE i={i}]')
実行結果は次のとおり。確かに else! から始める行が出力されています。
0 1 2 [ELSE i=2]
ただし、break を利用してループを抜けた場合は、else ブロックは実行されません。
for i in range(3):
print(i, end=" ")
if 1 < i: # i が 1 より大きい場合は brek
break
else:
print(f'[ELSE i={i}]')
実行結果は次のようになります。
0 1 2
今度は上の場合と違って、else の部分は実行されていないことがわかります。
以上、ここでは Python の for 文による繰り返しについて説明しました。