【Python】多重ループ(九九の表の表示)

2021年10月9日

Pythonにおける多重ループについて解説します。



多重ループによる九九の表の表示

繰り返しの中で繰り返しを行うことができ、入れ子の深さに応じて二重ループ、三重ループと言います。

それらの総称は多重ループです。

二重ループを利用して九九の表を表示したプログラムは以下の通りです。

九九の表のコード例


# 九九の表を表示

for i in range(1, 10):
  for j in range(1, 10):
    print(f'{i * j:3d}', end='')
  print()

実行結果

  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

上のコードの場合、外側のfor文ではiの値を1から9までインクリメントしています。

そのiの値のそれぞれに対して実行される内側のfor文ではjの値を1から9までインクリメントしています。

変数iの値を1から9まで増やす外側のfor文は9回繰り返されます。

その各繰り返しで変数jの値を1から9まで増やす内側のfor文が9回繰り返されます。

外側のfor文終了後の改行の出力は次の外側のfor文へと進むための準備です。

書式指定

コード中の{:3d}は10進数を3桁で表示する書式指定です。

3は表示桁数、dは10進数をそれぞれ表しています。

九九の表(二重ループ)の処理の仕組み

iが1の時:jを1から9とインクリメントしながら3桁で1 * jを表示して改行。

iが2の時:jを1から9とインクリメントしながら3桁で2 * jを表示して改行。

…中略…。

iが9の時:jを1から9とインクリメントしながら3桁で9 * jを表示して改行。

長方形の表示

長方形の表示のコード例


# 5行10列の長方形を表示

for i in range(5):
  for j in range(10):
    print('*', end='')
  print()

実行結果

**********
**********
**********
**********
**********

上のコードでは九九の表を応用して二重ループを利用して記号文字*で長方形を表示しています。

0~4の5行、0~9の10列なので指定した数値の行列になるので九九の表よりも直観的だと思われます。



直角長方形の表示

左下直角三角形の表示のコード例


# n行の左下直角三角形を表示

n = int(input('何行の左下直角三角形 : '))

for i in range(n):
  for j in range(i + 1):
    print('*', end='')
  print()

実行結果

何行の左下直角三角形 : 5
*
**
***
****
*****

まず外側のfor文で変数iの値を0から4までインクリメントしています。

その各行で実行される内側のfor文では変数jの値を0からi + 1までインクリメントしています。

iが0のときjが0つまり0行0列目の1個に*を表示させます。

iが1のときjが0,1つまり1行0列目と1行1列目の2個に*を表示させます。

iが2のときjが0,1,2つまり2行0列目と2行1列目と2行2列目の3個に*を表示させます。

iが3のときjが0,1,2,3つまり3行0列目と3行1列目と3行2列目と3行3列目の4個に*を表示させます。

iが4のときjが0,1,2,3,4つまり4行0列目と4行1列目と4行2列目と4行3列目と4行4列目の5個に*を表示させます。

こうすることで左下が直角の三角形を表示できます。

右下直角三角形の表示のコード例


# n行の右下直角三角形を表示

n = int(input('何行の右下直角三角形 : '))

for i in range(n):
  for _ in range(n - i - 1):
    print(' ', end='')
  for _ in range(i + 1):
    print('*', end='')
  print()

実行結果

何行の右下直角三角形 : 5
    *
   **
  ***
 ****
*****

左下とは違い右下直角だと内側のfor文は2つあります。

というのも記号文字*を表示する前にそれぞれの行に適した個数のスペースを表示させているからです。

1つ目のfor文 : n – i – 1個の空白文字’ 'を表示。

2つ目のfor文 : i + 1個の記号文字’*’を表示。

空白文字と記号文字の合計はnとなるので右下が直角の三角形となります。