入れ子ループで九九を作る
入れ子ループで九九を作る とは
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外側の i が 1 の間に、内側の j が 1, 2, 3 まで動き、その後 i が 2 に進む、という順番です。九九表もこれと同じ動きで、外側 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 を作り、内側のループで掛け算結果を入れ、最後に table に row を append します。row を外側で作り直すのが重要で、ループの 外 に置いてしまうと、毎回同じリストに追加してしまいおかしくなります。
内側のリストはループに入る前に毎回 [] で初期化することがポイントです。
内包表記でもっと短く書くこともできます。次のコードと上のコードは同じ結果を返します。Python の表現力に慣れてきたら、内包表記版にも触れてみましょう。
Python
def make_kuku():
return [[i * j for j in range(1, 10)] for i in range(1, 10)]動きを追ってみる
入れ子ループの動きをフローで眺めると、外側と内側の入れ替わりが分かりやすくなります。
各 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 次元リストで、行 i 列 j の値は (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 つができることを確認しましょう。
- 入れ子で九九 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. 入れ子で九九 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- 外側の for で段、内側の for で列を回すこと
- 戻り値は 9x9 の 2 次元リストにすること
- 行ごとに 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]]