かゆい所に手が届く解説

Pythonで九九のスクリプトをキレイに出力する方法

Pythonのfor文 の学習では、二重ループの練習として九九表の問題があります。

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  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文 が理解できている方を想定しています。

しかし、range関数 を使った for文 の基本についても説明しています。

どうぞ初心者の方も安心して読み進めてください。

なお、for文 についてこちらの記事で詳しくご紹介しています。

for文とrange関数の基礎

理解できている方はここまで読み飛ばしてください。

range関数 を使った for文 の記述は、いくつかパターンがあります。

その中でも、今回は range関数 の引数に2つの値を指定した場合について理解しておく必要があります。

九九は「1~9」の計算なので、1の段は「1×1」から「1×9」となります。

つまり、計算対象は最大で「9」=「1~9」を繰り返しの条件にすれば良いのです。

for i in range(1, 10):

以上の様に、range関数 に「1, 10」と指定することで、「1~9まで繰り返す」という指定ができます。

書式の意味は、

range(start, end)

ですが、end の値から「-1」した数まで繰り返すことになる点に注意してください。

改めて、上記の range関数 を使って for文 に print文 を入れると、

for i in range(1, 10):
    print(i)

を実行した時、
変数iの値は「1から始まって9になるまでインクリメント(1ずつ加算)」されます。

1
2
3
4
5
6
7
8
9

九九表作成の基礎知識

二重ループの仕組み

二重ループは初めて、という方には少し難しいかもしれません。

良く言われる表現として、「外側のループ」と「内側のループ」という説明があります。

外側と内側について理解するため、例として次のスクリプトを用意しました。

range関数 の引数は(1, 4)としているため、変数の値は「1~3」を繰り返します。

for i in range(1, 4):
    for j in range(1, 4):
        print('iの値は', i, ' ', 'jの値は', j)
    print()

この時、4行目の空の print() を入れることによって、内側のループが終わったときに1行空白行を入れています。(見やすくするため。)

これを実行すると、

iの値は 1   jの値は 1
iの値は 1   jの値は 2
iの値は 1   jの値は 3

iの値は 2   jの値は 1
iの値は 2   jの値は 2
iの値は 2   jの値は 3

iの値は 3   jの値は 1
iの値は 3   jの値は 2
iの値は 3   jの値は 3

となります。

このとき、「外側のループ」とは「変数i」のことを言い、「内側のループ」とは「変数j」のことを言います。

もう少し分かりやすい日常に合わせた例もご紹介します。

二重ループの例題

1年は12カ月あります。

そこで、「外側のループ」は2000年から2002年まで繰り返し、「内側のループ」は1月から12月まで繰り返すスクリプトを用意しました。

range関数 の第二引数(2003)はマイナス1(2002)となるため、2000年から2002年まで繰り返すことなります。

for i in range(2000, 2003):
    for j in range(1, 13):
        print(i, '年', j, '月')
    print()

実行すると、このようになります。

2000 年 1 月
2000 年 2 月
2000 年 3 月
2000 年 4 月
2000 年 5 月
2000 年 6 月
2000 年 7 月
2000 年 8 月
2000 年 9 月
2000 年 10 月
2000 年 11 月
2000 年 12 月

2001 年 1 月
2001 年 2 月
2001 年 3 月
2001 年 4 月
2001 年 5 月
2001 年 6 月
2001 年 7 月
2001 年 8 月
2001 年 9 月
2001 年 10 月
2001 年 11 月
2001 年 12 月

2002 年 1 月
2002 年 2 月
2002 年 3 月
2002 年 4 月
2002 年 5 月
2002 年 6 月
2002 年 7 月
2002 年 8 月
2002 年 9 月
2002 年 10 月
2002 年 11 月
2002 年 12 月

多重(3重)ループの例題

3重でも4重でもループの考え方は同じです。

年月日を3重ループで実現する場合、次の様にします。

なお、今回は結果を簡単にするため、2000年~2002年>1月~3月>1日~3日のみをループしています。

for year in range(2000, 2003):
    for month in range(1, 4):
        for day in range(1, 4):
            print(year, '年', month, '月', day, '日')
        print()

実行すると、

2000 年 1 月 1 日
2000 年 1 月 2 日
2000 年 1 月 3 日

2000 年 2 月 1 日
2000 年 2 月 2 日
2000 年 2 月 3 日

2000 年 3 月 1 日
2000 年 3 月 2 日
2000 年 3 月 3 日

2001 年 1 月 1 日
2001 年 1 月 2 日
2001 年 1 月 3 日

2001 年 2 月 1 日
2001 年 2 月 2 日
2001 年 2 月 3 日

2001 年 3 月 1 日
2001 年 3 月 2 日
2001 年 3 月 3 日

2002 年 1 月 1 日
2002 年 1 月 2 日
2002 年 1 月 3 日

2002 年 2 月 1 日
2002 年 2 月 2 日
2002 年 2 月 3 日

2002 年 3 月 1 日
2002 年 3 月 2 日
2002 年 3 月 3 日

となります。

多重ループの場合も、基本的に最も内側から順にループが行われ、外側のループが終わると全てのループが終了することになります。

for文についてもっと詳しく知りたい方へ

今回の記事について、最低限必要な for文 の説明については以上です。

もっと詳しく知りたいという方は、こちらの記事をご覧ください。

基本的な九九表の作成

それでは、基本的な九九表をプログラミングする考え方について順を追って説明します。

※この点について理解されている方は、「きれいな九九表の作り方」まで飛んでください。

九九表は、1の段から9の段まで掛け算を繰り返します。

つまり、

1の段
2の段
3の段
・
・
・
9の段

のように「掛け算の結果」を出力したいのです。

実行結果の一例
今回の目的

計算式としては、

1 × 1
1 × 2
1 × 3
1 × 4
1 × 5
1 × 6
1 × 7
1 × 8
1 × 9

2 × 1
2 × 2
・
・
・
8 × 8
8 × 9

9 × 1
9 × 2
9 × 3
9 × 4
9 × 5
9 × 6
9 × 7
9 × 8
9 × 9

このようにしたいですね。

これをスクリプトで表すと、

for x in range(1, 10):
    for y in range(1, 10):
        print(x, '×', y)
    print()

となります。

4行目の空の print() の意味は前述の説明と同じく、空白行を入れて分かりやすくするためです。

実際の計算をするときは、「○の段」ごとに1行にまとめたいと思うので、print文 の中に「end=’ ‘」を入れます。

※「’ ‘」の間はスペースを入れています

for x in range(1, 10):
    for y in range(1, 10):
        print(x, '×', y, end=' ')
    print()

これによって、

1 × 1 | 1 × 2 | 1 × 3 | 1 × 4 | 1 × 5 | 1 × 6 | 1 × 7 | 1 × 8 | 1 × 9 | 
2 × 1 | 2 × 2 | 2 × 3 | 2 × 4 | 2 × 5 | 2 × 6 | 2 × 7 | 2 × 8 | 2 × 9 | 
3 × 1 | 3 × 2 | 3 × 3 | 3 × 4 | 3 × 5 | 3 × 6 | 3 × 7 | 3 × 8 | 3 × 9 | 
4 × 1 | 4 × 2 | 4 × 3 | 4 × 4 | 4 × 5 | 4 × 6 | 4 × 7 | 4 × 8 | 4 × 9 | 
5 × 1 | 5 × 2 | 5 × 3 | 5 × 4 | 5 × 5 | 5 × 6 | 5 × 7 | 5 × 8 | 5 × 9 | 
6 × 1 | 6 × 2 | 6 × 3 | 6 × 4 | 6 × 5 | 6 × 6 | 6 × 7 | 6 × 8 | 6 × 9 | 
7 × 1 | 7 × 2 | 7 × 3 | 7 × 4 | 7 × 5 | 7 × 6 | 7 × 7 | 7 × 8 | 7 × 9 | 
8 × 1 | 8 × 2 | 8 × 3 | 8 × 4 | 8 × 5 | 8 × 6 | 8 × 7 | 8 × 8 | 8 × 9 | 
9 × 1 | 9 × 2 | 9 × 3 | 9 × 4 | 9 × 5 | 9 × 6 | 9 × 7 | 9 × 8 | 9 × 9 | 

このように内側のループが終わるまではそれぞれの出力の間に空白(上の例では空白の代わりに|」)を入れています。

実際には計算結果を表示しますので、

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

こうなります。

このままでは不揃いで見づらいので、整形してみましょう。

きれいな九九表の作り方

ここからが本題です。

いくつかやり方がありますので、順番に説明していきましょう。

①フォーマット文字列を使う方法

まずは、分かりやすい方法からご紹介します。

フォーマット文字列について詳しく知りたいという方は、こちらの記事が参考になります。

フォーマット文字列を使うと、書式を指定した表示が可能となります。

今回は、計算結果が1桁と時も2桁の時も「揃えて表示したい」と考えるので、フィールド幅を「2」に揃えたいと思います。

その場合、フォーマット文字列の{}内にコロンで区切って「フィールド幅」を指定します。

for x in range(1, 10):
    for y in range(1, 10):
        print(f'{x * y:2}', end=' ')
    print()

ポイントは、{x * y} の書式を「フィールド幅:2」に設定するために、

{x * y:2}

とすることで、計算結果が1桁でも2桁でも「フィールド幅:2」に設定することができます。

 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 

②書式化演算子「%」を使う方法

これについては、Python の初心者の方は見なかったことにしてください。

Java や C# など他のプログラミング言語に慣れている方にはお馴染みかと思いますが、Python でわざわざ使う必要もありません。

一応説明しておくと、以下の様に記述することで同じように出力することが可能となります。

for x in range(1, 10):
    for y in range(1, 10):
        print('%2d' %(x*y) , end=' ')
    print()

「%2d」の意味は、2桁の10進数で表示するということになります。
(間違っていたらすみません。)

その書式を設定する対象を「%(x*y)」としています。

 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 

③numpyを使う方法

これは初心者の方に対しては応用的なやり方だと思いますが、面白いと思うのでご紹介します。

numpy というモジュールを利用することで、行列の演算が簡単にできます。

なお、③については「紹介」のみとしますので、モジュールのインストールとスクリプトの意味については省略します。

import numpy as np

x = np.arange(1, 10).reshape(1, -1)
y = np.arange(1, 10).reshape(-1, 1)
kuku = x * y
print(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]]

となります。

numpy についての説明は省略しますが、詳しく説明してくれるサイトがたくさんあるので、調べてみてください。

なお、numpy は行列計算が非常に速いです。

例えば、前の①や②のようにfor文で「1×1」から「9999×9999」を処理しようとすると、完了するまで数十分かかります。

しかし、③のように numpy で処理すると数秒で終わります。

AI で画像処理をする際に大量の行列計算が必要になりますが、そのときに numpy が重宝します。

機会があれば、numpy を使ったスクリプトも紹介しますね。

まとめ

今回は Python で九九表を出力する方法を一通りご紹介しました。

初心者の方に向けて基礎から説明しているので、経験者の方には説明が長いと思われたかもしれませんね。

他にもやり方はありますが、ここで紹介した内容をベースとして、他の方法も試してみると良いでしょう。

Pythonについて詳しく知りたいという方は、こちらの書籍もおススメです。

それでは、ステキなPythonライフを!

ABOUT ME
papa3
某教育機関で現役の講師をしながら、ブログとYouTubeでプログラミングの情報を発信しています。個人でもウェブアプリケーション開発と運営をしながら本業収入<副業を目指しています!

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です