0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[光-Hikari-のPython]05章-05 制御構文(for文~多重ループ~)

Last updated at Posted at 2020-06-06

#[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重ループでよく説明される、掛け算の九九の表を出力するプログラムを作成してみましょう。chap05の中に、05-05-01.pyというファイル名でファイルを作成し、以下のコードを書いてください。

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実行結果>

【実行結果】
※正式には整列されて出力されます。(Qiita上では少しずれていますがご了承ください)
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)を用いて説明します。

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

【1ループ目(外側)】【1ループ目(内側)】
次に、(2)**for i in range(1, 10):の中身に入ります。するとすぐにfor j in range(1, 10):**が出てきます。(この時点で、**i = 1, j = 1**です。)

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

【1ループ目(外側)】【2ループ目(内側)】
(2)の**for j in range(1, 10):**の処理になります。(この時点で、**i = 1, j = 2**です。)

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

【1ループ目(外側)】【3ループ目(内側)】
(2)の**for j in range(1, 10):**の処理になります。(この時点で、**i = 1, j = 3**です。)

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

  <j=9になるまで繰り返します。>

【1ループ目(外側)】【9ループ目(内側)】
(2)の**for j in range(1, 10):**の処理になります。(この時点で、**i = 1, j = 9**です。)

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

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

【2ループ目(外側)】
そして、(1)の**for i in range(1, 10):**に戻ります。(この時点で、i = 2, j = 9です。)

【2ループ目(外側)】【1ループ目(内側)】
次に、(2)**for i in range(1, 10):の中身に入ります。するとすぐにfor j in range(1, 10):**が出てきます。(この時点で、**i = 2, j = 1**です。)

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

  <以後、i=9, j=9になるまで繰り返します。>

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

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

###【目次リンク】へ戻る

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?