入れ子ループで九九を作る

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

入れ子ループで九九を作る とは

for の入れ子で 2 次元のリスト (九九表) を作る基本パターンを学ぶ。本レッスンでは、入れ子ループで九九を作る の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

入れ子ループで九九を作る

ループの中にもう一段ループを書くと、2 次元のデータを作ったり走査したりできます。これを 入れ子ループ (ネストしたループ) と呼びます。代表的な題材は九九表で、外側のループで「段」、内側のループで「行内の値」を回します。本レッスンでは、入れ子の for を使って 1 から 9 までの掛け算の結果を 2 次元リストにまとめる関数を実装します。

入れ子ループは、表 (行と列) を作る・走査する万能ツールです。

入れ子ループの構造

入れ子ループは「外側のループ 1 回ごとに、内側のループが完全に 1 周する」イメージです。外側が i、内側が j の場合、(i, j) の組み合わせは (1, 1), (1, 2), (1, 3), ..., (2, 1), (2, 2), ... のように動きます。

Python

for i in range(1, 4): for j in range(1, 4): print(i, j) # 1 1, 1 2, 1 3, 2 1, 2 2, 2 3, 3 1, 3 2, 3 3

外側の i1 の間に、内側の j1, 2, 3 まで動き、その後 i2 に進む、という順番です。九九表もこれと同じ動きで、外側 i と内側 j の積 i * j を順番に並べると 9 段が出来上がります。

外側 = 段、内側 = 列、と覚えておくと混乱しません。

2 次元リストを作る

本レッスンの課題は、1〜9 の段の九九表を 9x9 の 2 次元リストとして返す関数 make_kuku() を実装することです。各段は内側のリストとして表現します。

Python

def make_kuku(): table = [] for i in range(1, 10): row = [] for j in range(1, 10): row.append(i * j) table.append(row) return table

このコードは、外側のループが回るたびに 新しい row を作り、内側のループで掛け算結果を入れ、最後に tablerowappend します。row を外側で作り直すのが重要で、ループの に置いてしまうと、毎回同じリストに追加してしまいおかしくなります。

内側のリストはループに入る前に毎回 [] で初期化することがポイントです。

内包表記でもっと短く書くこともできます。次のコードと上のコードは同じ結果を返します。Python の表現力に慣れてきたら、内包表記版にも触れてみましょう。

Python

def make_kuku(): return [[i * j for j in range(1, 10)] for i in range(1, 10)]

動きを追ってみる

入れ子ループの動きをフローで眺めると、外側と内側の入れ替わりが分かりやすくなります。

diagram (will load when visible)

i ごとに 新しい row を作り、内側のループで埋めて、最後に table に追加する、というのが鉄則です。

よくある間違い

入れ子ループでつまずきやすいポイントは次の通りです。

  • row = [] を外側ループの前に置いてしまい、行が累積する
  • 外側と内側の range を逆にして、表が縦横で入れ替わる
  • 内側ループの append を外側に書いてしまい、table が空のまま
  • i * j ではなく i + j を計算してしまう
  • インデントを間違えて、内側のループから外に出てしまう

Python

# NG: row を外側の外で初期化 row = [] for i in range(1, 10): for j in range(1, 10): row.append(i * j) table.append(row)

このコードでは、row がループ全体で 共有 されてしまい、table に同じリスト参照を 9 回追加することになります。結果は 81 個の値が入った 1 本のリストを 9 個並べたものになり、意図と全く違うものができます。row = [] は必ず外側ループの に書きましょう。

入れ子ループでは「内側で完結する処理」と「外側にまたがる処理」を頭の中で分けて考える癖をつけましょう。

やってみよう

このレッスンでは、引数なしで呼び出される関数 make_kuku() を実装します。返り値は 9 行 9 列の 2 次元リストで、行 ij の値は (i + 1) * (j + 1) (1 始まりに換算すると i * j) になっている必要があります。すなわち最初の行は [1, 2, 3, 4, 5, 6, 7, 8, 9]、最後の行は [9, 18, 27, 36, 45, 54, 63, 72, 81] です。

余裕があれば、行を文字列に整形して ' '.join(...) で表示してみると、テキスト版の九九表が完成します。

よくある質問

Q. このトピックは Python 以外の言語でも同じ書き方ですか?

A. 考え方は他言語と共通ですが、構文や標準ライブラリは異なります。Python はインデントでブロックを表し、コロン + 改行で構造を作るのが特徴です。他言語に移行する際は基本概念を維持しつつ、構文の差分を意識して書き換えると混乱が少ないです。

Q. 実行してエラーが出た場合の対処は?

A. エラーメッセージの最後の行(TypeError や NameError などの型)から原因と該当行を確認します。Python はトレースバックが下から上に読むと「呼び出し元 → 内部」の順で辿れます。print や IDE のデバッガで途中の変数を確認すると原因が見えてきます。

Q. 次のステップで何を学ぶべきですか?

A. 本レッスンの内容を理解できたら、本文の「やってみよう」を実装し、章末クイズに進むのがおすすめです。さらに自分のミニアプリ(電卓・todo・スコア集計など)に応用するとスキルが定着します。詰まったら本文の H2 セクションに戻って読み返してください。

次のレッスン

次は ループで素数を列挙する で、for の入れ子で 2 次元のリスト (九九表) を作る基本パターンを学ぶ を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. 入れ子で九九 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. 入れ子で九九 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. 外側の for で段、内側の for で列を回すこと
  2. 戻り値は 9x9 の 2 次元リストにすること
  3. 行ごとに row を空リストで初期化すること

入出力例

test-cases.txt

make_kuku()[[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]]

ヒント

main.py
main.py
学習モード

メモ

入れ子ループで九九を作る

⌘S で保存