3. 反復構造

反復構造は、同じ処理を繰り返し実行することができる構造です。
順次構造では、上から下に記述された順番で処理を実行しましたが、反復構造ではある行の処理を繰り返し実行することができます。

Pythonでは主にfor文while文の2つの構文で選択処理を行います。

for文

for文は、ある範囲の値を順番に取り出して処理を行う構文です。

for文の書き方

Pythonにおけるfor文の一般的な記法は以下のとおりです。

for 変数 in 文字列・配列など:
	実行文

Pythonでは実行文をまとめるために インデント(字下げ) を用います。インデントは行頭に空白を加えて行の開始位置を右にずらすことであり、Pythonではインデントで実行文のまとまりを表します。Pythonでは慣習的に 半角スペース4つ をインデントとして使うことが多いです。

for文では、for文を用いて繰り返したい処理をインデントして記述します。例えば、以下の場合、for文の下にインデント(字下げ)された「実行文1」「実行文2」が繰り返し実行されます。「実行文3」はインデントされていないため、for文の繰り返し処理の対象ではありません。for文の処理が終わった後に順次構造で実行されます。

for 変数 in 文字列・配列など:
	実行文1
	実行文2
実行文3

1. for 変数 in 配列を使ったfor文の作成

for 変数 in 配列と書くことで、配列の要素を順番に取り出して繰り返し処理を行います。

以下の、配列の各要素を順番に取り出して分かりやすく出力するプログラムを通してfor文の動きを理解してみましょう。

例題1
list1 = [1, 2, 3]
for i in list1:
	index = i - 1
	print(f"list1[{index}] = {list1[index]}")
print("end")

繰り返される対象:
for文では、forの書かれた行の下にインデントされた行が繰り返し処理の対象となります。そのため、例題1では3行目と4行目が繰り返される処理となります。

繰り返される回数:
また、繰り返される回数はinの後に指定した配列の要素数になります。例題1では、list1の要素数は3つであるため、3行目と4行目の処理が3回繰り返されます。

繰り返し処理の中での変数の値:
for 変数 in 配列変数には、配列の要素が繰り返された回数に応じて先頭から順番に代入されます。例題3の場合、iには1回目の繰り返しでは1(配列list11番目の要素)、2回目の繰り返しでは2(配列list12番目の要素)、3回目の繰り返しでは3(配列list13番目の要素)が代入されます。このiは、繰り返しの回数に応じた値を持つ変数です。

すなわち、例題3のfor文の処理は以下のようになります。

  1. 1周目ではilist11つ目の要素である1が代入され、print関数によってlist1[0] = 1が表示される。
  2. 2周目ではilist12つ目の要素である2が代入され、print関数によってlist1[1] = 2が表示される。
  3. 3周目ではilist13つ目の要素である3が代入され、print関数によってlist1[2] = 3が表示される。

(※「2.配列」のページでも説明しましたが、配列の要素を指す添字は0から始まることに注意してください。)

2. for 変数 in range(値1, 値2, 増減値)を使ったfor文の作成

range関数は、連続する数字の配列を自動で生成する関数です。range(値1, 値2, 増減値)を使うことで、値1から値21つ前の値まで増減値ずつ増やす数列を生成することができます。以下にrange関数の例を示します。

for 変数 in range(値1, 値2, 増減値)を使うと、range関数で生成した数列を使って繰り返し処理を行うことができます。すなわち、for 変数 in range(2, 5, 1)は、for 変数 in [2, 3, 4]と同じ意味になります。

例題1と同様のprintを行うプログラムは以下のようになります。

例題2
list1 = [1, 2, 3]
for i in range(0, 3, 1): # 0, 1, 2 の数列を生成
	print(f"list1[{i}] = {list1[i]}")
print("end")

3. for 変数 in range(回数)を使ったfor文の作成

range(回数)は、range(0, 回数, 1)の短縮記法です。for 変数 in range(回数)を使うことで、0から回数-1までの数列を生成し、繰り返し処理を行うことができます。

例題1と同様のprintを行うプログラムは以下のようになります。

例題3
list1 = [1, 2, 3]
for i in range(3): # 0, 1, 2 の数列を生成
	print(f"list1[{i}] = {list1[i]}")
print("end")

楽に記述できる反面、開始する数字を変えたり、増減値を変えたりすることができないため、使い分けが必要です。

while文

while文は、ある条件が満たされている間(条件が真の間)、処理を繰り返し実行する構文です。条件が満たされている間は繰り返し処理が続きますが、条件が満たされなくなると、while文の処理が終了します。

while文の書き方

Pythonにおけるwhile文の一般的な記法は以下のとおりです。for文と同様に、繰り返し処理の対象をインデント(字下げ)します。

while 条件:
	実行文

while文では、whileの後に指定した条件が真(条件が正しく、成り立っている状態)の間、インデントされた「実行文」が繰り返し実行されます。条件が偽(条件が間違っており、成り立たない状態)になると、while文の処理が終了します。

通常、インデントされている繰り返し処理の中で条件を偽にする処理を行うことで、while文の処理が終了するようにします。

while文の作成

例題4では、while文を使って0から2までの値を順番に取り出し、対応する添字番目の配列の要素を出力する処理を行うプログラムを作成します。

例題4
list1 = [1, 2, 3]
i = 0
while i < 3:
	print(f"list1[{i}] = {list1[i]}")
	i = i + 1
print("end")

while文の条件式は、i < 3となっています。この条件式は、i3未満の間、条件が真となり繰り返し処理を行います。例題4の場合、

  1. 1周目ではi0が代入され、print()によってlist1[0] = 1が表示される。その後、i = i + 1によってiの値が1になる。
  2. 2周目ではi1が代入され、print()によってlist1[1] = 2が表示される。その後、i = i + 1によってiの値が2になる。
  3. 3周目ではi2が代入され、print()によってlist1[2] = 3が表示される。その後、i = i + 1によってiの値が3になる。
  4. 4周目ではi3が代入されるが、i < 3の条件が偽になるため、繰り返し処理が終了する。そして、順次処理であるprint("end")の実行に移る。

という流れになります。

画面右の実行可視化部分から「例題4」を選択して、実行の様子を確認してみましょう。

2重のfor文・while文

for文やwhile文の中に、さらにインデントして別のfor文やwhile文を記述することもできます。このように、複数の繰り返し処理を組み合わせることで、複雑な処理を行うことができます。

for文を2重に使った例題5を以下に示します。画面右の実行可視化部分から「例題5」を選択して、実行の様子を確認してみましょう。

例題5
for i in range(3):
    for j in range(3):
        print(i, j)
print("end")

まとめ

反復構造は、同じ処理を繰り返し実行する構造です。
Pythonでは主にfor文while文の2つの構文で選択処理を行います。

for 変数 in 文字列・配列など:
	実行文1
	実行文2
	...
while 条件:
	実行文1
	実行文2
	...(いずれかの実行で条件の変更をする)

問題1

10以下の偶数を順番に1行ずつ出力し、また最後に「end」と出力するプログラムを作成する。このプログラムを完成させるために、「ア」に入るべき値としてふさわしいものは何か?

for i in range(「ア」):
	print(i)
print("end")

答え:2, 11, 2
range(a, b, c)では、aから bの1つ前の数字 まで、cずつ増やしながら繰り返し処理を行うことに注意が必要です。そのため、

  1. 2, 10, 1 : 2 ~ 9 (10の1つ前) までの数字を1ずつ増やしながら出力するので、出力される数字は順に2, 3, 4, 5, 6, 7, 8, 9となり、不適(10が含まれておらず、また奇数が出力されるため)。
  2. 2, 10, 2 : 2 ~ 9 (10の1つ前) までの数字を2ずつ増やしながら出力するので、出力される数字は順に2, 4, 6, 8となり、不適(10が含まれていないため)。
  3. 2, 11, 1 : 2 ~ 10 (11の1つ前) までの数字を1ずつ増やしながら出力するので、出力される数字は順に2, 3, 4, 5, 6, 7, 8, 9, 10となり、不適(奇数が出力されるため)。
  4. 2, 11, 2 : 2 ~ 10 (11の1つ前) までの数字を2ずつ増やしながら出力するので、出力される数字は順に2, 4, 6, 8, 10となり、適切 な回答です。
問題1
for i in range(2, 11, 2): # 2, 4, 6, 8, 10
	print(i)
print("end")

問題2

問題1と同様に10以下の偶数を順番に1行ずつ出力し、また最後に「end」と出力するプログラムを、今度はwhile文を用いて作成する。このプログラムを完成させるために、「ア」「イ」に入るべき値の組み合わせとしてふさわしいものは何か?

i = 2
while i < 「ア」:
	print(i)
	i = 「イ」
print("end")

答え:ア : 11、 イ : 2
while文では、条件が真の間繰り返し処理を行います。そのため、条件が偽になるような処理を行うことが重要です。

  1. ア : 11、 イ : i + 1 : i11未満の間、iを出力し、i1増やす処理を行うため、出力される数字は順に2, 3, 4, 5, 6, 7, 8, 9, 10となり、不適(奇数が出力されるため)。
  2. ア : 11、 イ : i + 2 : i11未満の間、iを出力し、i2増やす処理を行うため、出力される数字は順に2, 4, 6, 8, 10となり、適切 な回答です。
  3. ア : 12、 イ : i + 1 : i10未満の間、iを出力し、i1増やす処理を行うため、出力される数字は順に2, 3, 4, 5, 6, 7, 8, 9となり、不適(10が含まれておらず、また奇数が出力されるため)。
  4. ア : 12、 イ : i + 2 : i10未満の間、iを出力し、i2増やす処理を行うため、出力される数字は順に2, 4, 6, 8となり、不適(10が含まれておらず、また奇数が出力されるため)。
問題2
i = 2
while i < 11:
	print(i)
	i = i + 2
print("end")