はじめに
ここでは、pythonプログラミングの基本である、for文について解説します。まずは、Google Colaboratoryの使い方 を参考に、プログラミングの環境に移動しましょう。ローカルに環境を構築している方は、そちらでもokです。
for 文とは
プログラムを組んでいるとき、似たような処理を繰り返すことがよくあります。例えば、以下のコードを見てください。
base_value = 2
print(base_value, "の段の", 1, "つ目は", base_value * 1, "です。")
print(base_value, "の段の", 2, "つ目は", base_value * 2, "です。")
print(base_value, "の段の", 3, "つ目は", base_value * 3, "です。")
print(base_value, "の段の", 4, "つ目は", base_value * 4, "です。")
print(base_value, "の段の", 5, "つ目は", base_value * 5, "です。")
print(base_value, "の段の", 6, "つ目は", base_value * 6, "です。")
print(base_value, "の段の", 7, "つ目は", base_value * 7, "です。")
print(base_value, "の段の", 8, "つ目は", base_value * 8, "です。")
print(base_value, "の段の", 9, "つ目は", base_value * 9, "です。")
これは、掛け算の2の段の結果を一つずつ表示する機能を有します。このコードを見たとき、ある特定の箇所が、1つずつ数字が増加しているという特徴があることがわかります。このように、あるルールに基づいて数字が変化するコードをいくつも記載したい場合、for文を利用して簡単に書くことができます。この記述方法が以下となります。
base_value = 2
for x in range(1, 10):
print(base_value, "の段の", x, "つ目は", base_value * x, "です。")
このコードのポイントは、以下となります。
- 2行目: for x in range(1, 10) という記述があります。これは、xを1から9まで一つずつ増やしながら、文字下げがされた部分を順次実行せよという意味を持ちます。range関数の第1引数がxの開始地点、第2引数から1を引いた値がxの終了地点を表します(1から10までではなく、1から9までなので、注意しましょう)。
- 3行目: xを1から9まで増やしながらprint関数が実行されます。x=1のときは 2*1、x=2 のときは 2*2、x=3のときは 2*3 と続き、x=9のときは 2*9 = 18 が表示されます。
なんとなくわかってきたら、もう少し理解を深めるために、以下を確認してみましょう。
- 2行目と3行目のxを、yに変えてみる。→ エラーが出ず、そのまま実行できます。for文で1ずつ増やす変数は、xではなくても良いわけです。
- 2行目をxにして、3行目のxをbに変えてみる。→ エラーが出ます。bは存在しないためです。1ずつ増えているのはあくまでxであることに注意してください。
- range関数の第1引数を5、第2引数を20にしてみる。→ エラーが出ず、実行できます。表示される値は想像通りか確認してみましょう。
これで、もうちょっとだけfor文のことがわかったと思います。
for文の範囲とインデント
Pythonでは、for文により繰り返される範囲を文字下げ(インデント)により定義します。これを理解するために、以下のコードを見てみましょう。
a = 10
for i in range(1, 4):
a = a + i * 5
print("aの値は", a, "です。")
print("処理終了!")
2行目をみると、iを1から3まで一つずつ増やしながら、繰り返しの処理をしていることがわかると思います。では、繰り返している箇所はどこでしょうか? それは、文字が下げられている部分(インデント)が入っている箇所を見るとわかります。上のコードでは、3行目と4行目にインデントが挿入されています。ですので、3行目と4行目が繰り返される範囲となります。もっと厳密に、上のコードがどのような順番で実行されるのか、下記に示します。
- 処理1: 1行目
- 処理2: 2行目
- 処理3: i=1 で 3行目(aに対し、10+1*5が代入される)
- 処理4: i=1 で 4行目(aは15ですから、15が表示される)
- 処理5: i=2 で 3行目(aに対し、15+2*5が代入される)
- 処理6: i=2 で 4行目(aは25ですから、25が表示される)
- 処理7: i=3 で 3行目(aに対し、25+3*5が代入される)
- 処理8: i=3 で 4行目(aは40ですから、40が表示される)
- 処理9: 5行目
このようになりますので、合計3回、print関数が適用され、3個の表示が行われます。ポイントは、3行目と4行目が順番に繰り返されるところでしょうか。
以下のコードは、上のコードとよく似ていますが、表示は異なります。
a = 10
for i in range(1, 4):
a = a + i * 5
print("aの値は", a, "です。")
print("処理終了!")
これを実行すると、先ほどとは異なり、aが40であるという表示が一つだけ出たと思います。この理由について考えてみるために、インデントに注目します。3行目にはインデントがありますが、4行目にはインデントがありません。ですから、4行目はfor文で繰り返される範囲の対象外になります。より厳密に書くと、以下のようになります。
- 処理1: 1行目
- 処理2: 2行目
- 処理3: i=1 で3行目(aに対し、10+1*5が代入される)
- 処理4: i=2 で3行目(aに対し、15+2*5が代入される)
- 処理5: i=3 で3行目(aに対し、25+3*5が代入される)
- 処理6: 4行目(この時点でaは40ですから、40が表示される)
- 処理7: 5行目
print関数がfor文の範囲の外にありますので、一度しか実行されていないことがわかります。ですから、aの値が一度しか表示されていません。ただし、計算はしっかりと行われていることもわかります。
以上がfor文の範囲をインデントで指定するというお話になります。なお、インデントは通常、Tabキーか半角スペースで記述します(Tabキーの位置はお使いのキーボードによって違うので、webなどで検索して調べてみましょう)。このインデントの量が揃っていないと、エラーが出たりおかしな挙動になったりしますので、注意してください。例えば、以下はインデントがおかしいことにより、エラーとなるコードです。
# エラーの出るコード1
a = 10
for i in range(1, 4):
a = a + i * 5
print("aの値は", a, "です。")
print("処理終了!")
# エラーの出るコード2
a = 10
for i in range(1, 4):
a = a + i * 5
print("aの値は", a, "です。")
print("処理終了!")
どちらも、4行目と5行目のインデントが揃っていません。ですので、エラーとなります。
for文を利用したリストの定義
以下のようなリストを、空のリスト(何も要素を持たないリスト)と言います。
list_A = []
さて、リストに要素を追加したい場合は、append関数を利用すると説明しました。2の倍数を100個有するリストを作ってみます。for文を使わない場合は、append関数を100個使わなければなりません。一方で、for文を利用すると、以下のように簡単に書くことができます。
list_A = []
for i in range(1, 101):
list_A.append(i*2)
print("2の倍数: ", list_A)
- i = 1 で list_A.append(i*2)を実施
- i = 2 で list_A.append(i*2)を実施
- i = 3 で list_A.append(i*2)を実施
- … 中略 …
- i = 100 で list_A.append(i*2)を実施
となるわけですから、list_A は2の倍数を100個持つことになります(101としないと i = 100 まで行かないので、注意してください)。
続いて、list_Aに2の倍数を100個、list_Bに3の倍数を100個持たせるコードを書いてみます。これは、以下、どれでも正解です。
list_A = []
list_B = []
for i in range(1, 101):
list_A.append(i*2)
list_B.append(i*3)
print("2の倍数: ", list_A)
print("3の倍数: ", list_B)
list_A = []
list_B = []
for i in range(1, 101):
list_A.append(i*2)
for i in range(1, 101):
list_B.append(i*3)
print("2の倍数: ", list_A)
print("3の倍数: ", list_B)
1つ目は list_A と list_B を同時に作成するアプローチ、2つ目は list_A を作成してから、list_B を作成するアプローチです。あえていえば前者の方がスマートですが、どちらでもいいです。
range関数における引数の省略
for文で使用することになる range関数は、通常2つの引数(開始地点と終了地点)を持ちますが、開始地点が0の場合、省略することができます。例えば、以下の2つのコードは、まったく同じ意味となります。
a = 0
for i in range(10):
a = a + 1
print(a)
a = 0
for i in range(0, 10):
a = a + 1
print(a)
上のコードは、range 関数の引数が1つしかありません。これは、開始地点が i = 0 であり、終了地点が i = 9 (10なので、1を引いて9です)であることを意味します。このように、開始地点が0である場合、記載しなくても動くようになっています。これをきちんと記載したものが下のコードです。
このため、range関数の引数に1つの数字しか入っていない場合は、開始地点0が省略されていると考えるようにしましょう。自分でコードを書く場合は、開始地点を省略していると、だんだんfor文の意味がわからなくなってくるので、きちんと2つの引数を与えることを推奨します。
以上がfor文の基礎となります。とても大切な記法なので、ぜひ覚えるようにしましょう。