ループとは
プログラミングにおいては、繰り返し同じ(似たような)処理を行うこと、またはその記述方法・文法のことをループと呼びます。
ループ文やループ構造とも表現されます。
Python の for ループ
Python の for ループは、他言語でいう for each ループのみとなっています。ただ、 for each ループは便利な半面、言語の基本的な事項を抑えていないと分かりづらいので、ここでは他言語でいうところの for ループの書き方を説明します。
数字をカウントアップする
例えば、画面に 1~10までの数字を print で表示する方法を考えてみます。
print(1)
最初に上記のように1を表示する print を書いてコピペするのでもいいでしょう。しかし、20 まで表示に変わったら、100までになったら?
この方法が現実的でないことが分かるでしょう。こういうときに、数字を使った for ループを使います。考え方が他の言語の for ループと近い形式です。
for i in range(1, 11): #1~10までカウントアップして、数字をiに入れる for 構造
print(i) #カウントアップしている i を表示する
上の Python をスペースもそのまま入力します。対話モードを使っている人もスペースのそのまま入力し、printの後に何も入力しないで Enter(空行)を入力します。
結果:
1
2
3
4
5
6
7
8
9
10
数字をカウントアップする for の基本的な構造
for 変数 in range(start, end_plus_1):
基本形は上記のようになります。 range() は print と同様に関数と呼ばれるプログラム上の仕組みですが、正確な説明は省きます。ここでは、 start の数値からスタートして、end_plus_1 より1少ない数値で止まる(つまり、止めたい数値 + 1 をここに入れる)と覚えてください。おまじないです。
例えば、
for i in range(5, 11): #5からスタートして、11より少ない数で終わる
print(i)
であれば
5
6
7
8
9
10
が出力されます。 start は分かりやすいですが、end_plus_1 が「終了する数字」や「回数」ではないことに気をつけてください。
数値を用いた for の活用方法:階乗
例として、1~10までの階乗を計算し、途中経過も出力してみます。
n = 1 #整数型を初期化
for i in range(1, 11): #1~10の数字のfor構造
n = n * i #前のループの階乗 * 今のループのiをnに代入
print(n) #nを出力
※n = の行と、 print行のインデントにつかう半角スペースの量を必ず揃えます。
結果:
1
2
6
24
120
720
5040
40320
362880
3628800
このような面倒な計算結果を簡単に途中経過も含めて出力できます。
Excel とどっちが楽と感じるかは、人それぞれでしょう 🙂
for で気をつけたい、Python の文法
for ~ in ~ :の後には必ずインデント(字下げ)をつける必要があります。インデントは、半角スペースまたはタブ文字を使います。Python では通常、インデント1段階につき半角スペース 4つを用います。
この、インデントされた部分をプログラミング言語においてブロックと呼び、処理のひとかたまりを示します。
参考として、以下のコードを見てみましょう。
n = 1 #整数型を初期化
for i in range(1, 11): #1~10の数字のfor構造
n = n * i #前のループの階乗 * 今のループのiをnに代入
print(n) #ここまでブロックの中
n = 0
print(n)
結果:
1
2
6
24
120
720
5040
40320
362880
3628800
0
n = 0 以降は 1度しか実行されないので、 0 が 1度出力されます。もちろん、階乗の計算結果にも影響はありません。
多重ループ
では、繰り返しの中に繰り返しを入れたい場合、多重ループをしたい場合をみてます。かけ算の 九九を出力するプログラムを書いてみます。
for i in range(1, 10): #iは1~9
for j in range(1, 10): #jも1~9
print(i, '*', j, '=', i * j) #シングルクォーテーションの有無に注意
print('-------') #インデントの数に注意
for in : ごとに、次の行からインデントを追加します。
※対話モードだと最後の printが入力できないので、ファイルに記載して実行します。
結果:
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
-------
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
2 * 8 = 16
2 * 9 = 18
-------
3 * 1 = 3
3 * 2 = 6
3 * 3 = 9
3 * 4 = 12
3 * 5 = 15
3 * 6 = 18
3 * 7 = 21
3 * 8 = 24
3 * 9 = 27
-------
4 * 1 = 4
4 * 2 = 8
4 * 3 = 12
4 * 4 = 16
4 * 5 = 20
4 * 6 = 24
4 * 7 = 28
4 * 8 = 32
4 * 9 = 36
-------
5 * 1 = 5
5 * 2 = 10
5 * 3 = 15
5 * 4 = 20
5 * 5 = 25
5 * 6 = 30
5 * 7 = 35
5 * 8 = 40
5 * 9 = 45
-------
6 * 1 = 6
6 * 2 = 12
6 * 3 = 18
6 * 4 = 24
6 * 5 = 30
6 * 6 = 36
6 * 7 = 42
6 * 8 = 48
6 * 9 = 54
-------
7 * 1 = 7
7 * 2 = 14
7 * 3 = 21
7 * 4 = 28
7 * 5 = 35
7 * 6 = 42
7 * 7 = 49
7 * 8 = 56
7 * 9 = 63
-------
8 * 1 = 8
8 * 2 = 16
8 * 3 = 24
8 * 4 = 32
8 * 5 = 40
8 * 6 = 48
8 * 7 = 56
8 * 8 = 64
8 * 9 = 72
-------
9 * 1 = 9
9 * 2 = 18
9 * 3 = 27
9 * 4 = 36
9 * 5 = 45
9 * 6 = 54
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81
-------
内側のループに使った変数 j が先にカウントアップされていっているが分かると思います。このように、 for in :構造では、インデントの数が等しい段階ごとにループが繰り返されています。
また、内側のループを抜けた後、インデントを1段階解除した print 関数が i がカウントアップされる前に一度だけ実行されています。
その他の文法:コメント
ここまで、サンプルで示しているソースコードの中に # ハッシュ記号があり、説明文の追記があることに気付いているかと思います
#行末までコメントなので好きなことを書ける
これは、コメントと呼ばれ、プログラムの動作とは直接関係のないテキストを自由に書ける仕組みです。
直接関係なく、とは書きましたが、通常はプログラムの動作についての説明などを記載し、後から参照したときや他の人が見たときにプログラムの意味を理解しやすくするといった目的で主に用いられます。