このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Python入門】for文のネスト

for文のネスト

 Pythonのfor文は、イテラブルなオブジェクトから要素を順次取り出して同じ処理を繰り返すための基本的な構文です。さらに、for文をネスト(入れ子)にすることで、2次元以上の反復処理が可能となり、複雑なパターンの生成や多次元データの操作が容易になります。
 ここでは、for文の基本構文、ネストしたfor文の記述方法、そして実践例として「九九の表」を出力するプログラムを通して、for文のネストについて詳しく解説します。

プログラムのダウンロード

 「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。

1.for文の基本とネストの概念

1.1. 基本的なfor文の構文

for文は以下のように記述します。

for 変数 in イテラブル:
    文1
    文2

解説

  • 変数には、イテラブルから取り出される各要素が順次代入されます。
  • イテラブルは、リスト、文字列、タプル、集合、辞書(キー)やrangeオブジェクトなど、繰り返し可能なオブジェクトです。
  • コロン(:)の後に改行し、同じインデント(通常は空白4個)で記述された文は、for文のブロックとして扱われます。

1.2. for文のネストの基本

 for文のネストとは、1つのfor文の内部に別のfor文を記述することです。これにより、2次元以上の反復処理(多重ループ)が可能になります。ネストしたfor文の基本構文は次のようになります。

for 変数A in イテラブルA:
    文1
    for 変数B in イテラブルB:
        文2

解説

  • 外側のfor文は、イテラブルAから各要素を順に取り出し、変数Aに代入します。
  • 各要素ごとに、内側のfor文が実行され、イテラブルBから各要素を変数Bに代入し、文2が実行されます。
  • この構造により、外側と内側の2重ループが形成され、多次元データの処理が可能となります。

2.実践例:九九の表を生成する

 ここでは、for文のネストを用いて、1から9までの掛け算の結果、すなわち九九の表を出力するプログラムを作成します。

2.1. 基本プログラムの記述

 以下のプログラムは、外側のfor文で段(1から9)を、内側のfor文で各段の掛け算相手(1から9)を取り出し、計算結果を表示します。

for x in range(1, 10):      # xには1から9までの整数が順に代入される
    for y in range(1, 10):  # xの各値に対し、yには1から9までの整数が代入される
        print(x * y, end=' ')  # x*yの結果を空白区切りで同じ行に出力
    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文 for x in range(1, 10): は、xに1から9までの整数を順に代入します。これにより、各行が1の段、2の段…9の段に対応します。
  • 内側のfor文 for y in range(1, 10): は、各段ごとにyに1から9までの整数を代入し、掛け算の計算を行います。
  • print(x * y, end=' ') は、計算結果を2桁で表示するために必要に応じてフォーマットを追加することもできます(例:f"{x*y:2}")。ここでは、出力結果が同じ行に空白区切りで表示されるように、end=' ' を指定しています。
  • 内側のループが終了すると、print() によって改行が行われ、次の段の出力が開始されます。

2.2. 出力のフォーマット調整(フォーマット済み文字列リテラル)

 表示される数字の桁数を揃えるために、f文字列とフォーマット指定子を使うことができます。以下のプログラムは、各計算結果を2桁で出力する例です。

for x in range(1, 10):
    for y in range(1, 10):
        print(f"{x*y:2}", 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 

解説

  • f"{x*y:2}" は、計算結果を2桁分のスペースに収めて表示します。
  • これにより、桁数が異なる結果も見た目が整然とし、九九表全体が読みやすくなります。

3.for文のネストの特徴と注意点

3.1. ネストの構造

 for文のネストは、内側のfor文が外側のfor文の各反復毎に完全に実行されるため、計算量が乗数的に増加します。そのため、ループの入れ子が深くなると処理時間に影響が出る場合があります。

3.2. インデントと可読性

 ネストされたfor文では、各ループのブロックを正しいインデントで記述することが重要です。また、コードが複雑になりすぎないよう、必要に応じてコメントや改行を活用して可読性を保つようにしましょう。

【表:for文のネストのポイント】

ポイント説明
外側ループ1から9までの各段(掛け算の段)を担当
内側ループ各段において1から9までの各数値と掛け算し、結果を出力
インデントの重要性各ブロックは同じインデント(通常4個の空白)で記述する必要がある。
可読性の工夫長いネストではコメントや適切な改行を使い、コードの構造を明確にする。

まとめ

for文のネストは、多次元の反復処理を実現するための基本的なテクニックです。

  • 基本構文: 外側のfor文で1つ目のイテラブル(ここでは1から9までの数値)を処理し、内側のfor文で別のイテラブル(同じく1から9までの数値)を反復処理します。
  • 出力整形: f文字列とフォーマット指定子を使用することで、計算結果をきれいに整形して表示できます。
  • 処理の流れ: 外側のループが1回実行されるたびに、内側のループが全て実行され、その結果として2次元の九九の表が出力されます。
  • 注意点: ネストが深くなると可読性が低下し、処理時間も増加するため、適切なインデントとコメントを活用してコードの整理に努める必要があります。

 これらの知識を応用することで、for文のネストを用いた複雑な反復処理も効率的に実装でき、より高度なプログラムの作成に役立てることができます。