[光-Hikari-のPython]05章-05 制御構文（for文～多重ループ～）

#[Python]05章-05 for文～多重ループ～
for文では、for i in range(10):の**:**の後にfor文内の処理を書きました。実は、このfor文内にさらにfor文を書くこともできます。

今回はfor文内にさらにfor文を書くといった、多重ループについて触れていきます。

##for文を使った多重ループ
forの2重ループを書く場合には、外側のforと内側のforで別の変数を使う必要があります。

```.py
for 変数1 in 繰り返し対象:
    for 変数2　in 繰り返し対象:
        繰り返し行う処理の内容
```
具体的に見ていきましょう。まずは2重ループでよく説明される、掛け算の九九の表を出力するプログラムを作成してみましょう。<font color="#00cccc">chap05</font>の中に、<font color="#00cccc">05-05-01.py</font>というファイル名でファイルを作成し、以下のコードを書いてください。

```05-05-01.py
for i in range(1, 10):  #(1)
    for j in range(1, 10):  #(2)
        print(i*j, end='\t') #(3)  end='\t'は改行せずにタブを出力
    print('') #(4)  次の段へ行くために、改行する処理
```

＜05-05-01.py実行結果＞
><font color="#090" bgcolor="black">【実行結果】</font>
<font color="red">※正式には整列されて出力されます。（Qiita上では少しずれていますがご了承ください）</font>
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

今回はコメント文の(1)～(4)を用いて説明します。

**<font color="#0cc">【1ループ目（外側）】</font>**
まず、(1)の**for i in range(1, 10):**ですが、range(10)にしなかった理由としては、range(10)にしてしまうと、0スタートになってしまうので、startは1と記載しています。（この時点で、**i = 1**です。）

**<font color="#0cc">【1ループ目（外側）】</font><font color="#090">【1ループ目（内側）】</font>**
次に、(2)**for i in range(1, 10):**の中身に入ります。するとすぐに**for j in range(1, 10):**が出てきます。（この時点で、**i = 1, j = <font color=red>1</font>**です。）

次に(3)のprint関数内で**i * j**の計算をしています。そしてそのまま出力しています、この時点で、**i = 1, j = 1**なので、出力結果は<font color=red>1</font>となります。
print関数内で**end='\t'**を指定しているため、そのまま改行せずに次の値は右側に出力します。そして、(2)に戻ります。

**<font color="#0cc">【1ループ目（外側）】</font><font color="#090">【2ループ目（内側）】</font>**
(2)の**for j in range(1, 10):**の処理になります。（この時点で、**i = 1, j = <font color=red>2</font>**です。）

次に(3)のprint関数内で**i * j**の計算をしています。そしてそのまま出力しています、この時点で、**i = 1, j = 2**なので、出力結果は<font color=red>2</font>となります。
print関数内で**end='\t'**を指定しているため、そのまま改行せずに次の値は右側に出力します。そして、(2)に戻ります。

**<font color="#0cc">【1ループ目（外側）】</font><font color="#090">【3ループ目（内側）】</font>**
(2)の**for j in range(1, 10):**の処理になります。（この時点で、**i = 1, j = <font color=red>3</font>**です。）

次に(3)のprint関数内で**i * j**の計算をしています。そしてそのまま出力しています、この時点で、**i = 1, j = 3**なので、出力結果は<font color=red>3</font>となります。
print関数内で**end='\t'**を指定しているため、そのまま改行せずに次の値は右側に出力します。そして、(2)に戻ります。

　　<font color=#0cc>＜j=9になるまで繰り返します。＞</font>

**<font color="#0cc">【1ループ目（外側）】</font><font color="#090">【9ループ目（内側）】</font>**
(2)の**for j in range(1, 10):**の処理になります。（この時点で、**i = 1, j = <font color=red>9</font>**です。）

次に(3)のprint関数内で**i * j**の計算をしています。そしてそのまま出力しています、この時点で、**i = 1, j = 9**なので、出力結果は<font color=red>9</font>となります。
print関数内で**end='\t'**を指定しているため、そのまま改行せずに次の値は右側に出力します。そして、(2)に戻ります。

そして、range(10)の範囲を超えたので、**for <font color=red>j</font> in range(1, 10):**から抜けます。（※**i**からはまだ抜けていないので注意）
そして、(4)のprint('')で改行します。これは九九の1の段が終わり、2の段に移行するためです。

**<font color="#0cc">【2ループ目（外側）】</font>**
そして、(1)の**for <font color=red>i</font> in range(<font color=red>1</font>, 10):**に戻ります。（この時点で、**i = 2, j = 9**です。）

**<font color="#0cc">【2ループ目（外側）】</font><font color="#090">【1ループ目（内側）】</font>**
次に、(2)**for i in range(1, 10):**の中身に入ります。するとすぐに**for j in range(1, 10):**が出てきます。（この時点で、**i = 2, j = <font color=red>1</font>**です。）

次に(3)のprint関数内で**i * j**の計算をしています。そしてそのまま出力しています、この時点で、**i = 2, j = 1**なので、出力結果は<font color=red>2</font>となります。
print関数内で**end='\t'**を指定しているため、そのまま改行せずに次の値は右側に出力します。そして、(2)に戻ります。

　　<font color=#0cc>＜以後、i=9, j=9になるまで繰り返します。＞</font>

そして、2重ループの外に出たら、処理が終了します。

##最後に
多重ループは説明した通り、結構複雑ではありますが、結局は処理回数が多くなっただけで、順に追っていけば理解できるかと思われます。
この2重ループのプログラムは途中説明を端折りましたが、ぜひ処理を追ってみてください。
机上でプログラムを追うことで、基本情報技術者試験などで出題されるアルゴリズム関連の問題の力にもなりますので、ぜひやってみてください。

###[【目次リンク】へ戻る](https://qiita.com/ko0821/items/379e8bd9e6ea01089419)