放課後Pythonラボ 第5時限目 モジュールとは何なのか、どんな時に使うもの?

こんにちは、森山です。

前回のコラムではif文(条件分岐)について学び、HIGH&LOWゲームを作りました。

ただ変数が固定なので、毎回結果が同じになってしまいます。これでは物足りないので、もっと面白くするためにランダムな数字を組み合わせて、ゲーム性の高いHIGH&LOWゲームに改造していきたいと思います。

そのためには初回のコラムの占いプログラムでも使っていた結果をランダムにするためのrandomモジュールが必要なのですが、プログラムの最初に import randomと書くことで初めてrandomモジュールを使うことができます。

ハイスクールPythonの6.5でも紹介されていますが、そもそもモジュールとは一体どんなものなのでしょうか。

モジュールって何?

Pythonを学び始めた時、ほとんどの人がつまずくのが「モジュールって何?」という疑問です。Webサイトなどで調べると「モジュールは Python の定義や文が入ったファイル」と書いてありますが、そう聞いてもすぐに「ああ、なるほど!」とはならないですよね。

モジュールという名前だけ見ると、見慣れない事もあって急に難しく見えてしまいますが、実は身近なものでイメージするとてもシンプルで「めちゃくちゃ便利なアイテム」なのです。

例えば、プログラムで乱数を自作しようとすると、とんでもなく大変です。
数式を作って、分布を整えて、偏りを消して…と数学の森に迷い込まなくてはなりません。
「乱数を簡単に使えるアイテム」があったら良いのにな、と誰もが思うと思います。
それこそが「モジュール」というアイテムの役割なのです。


そもそもモジュールとはどんなものなのか

わかりやすく知っているものに例えて、モジュールについて学んでいきましょう。
ファンタジー映画やゲームなどで「魔法使い」という存在がいますが、彼らが水の魔法を使う時に、分厚い魔法書を開いて詠唱したりしていますよね。

  • 魔法書には沢山の呪文が載っていて、そこに書かれている魔法を使う事ができる
  • 必要な魔法だけを呼び出して使う
  • 魔法書は巨大な図書館に保管されている

Pythonの世界では、この魔法書のことを「モジュール」と言います。
そして魔法書が収められている図書館は「ライブラリ」と呼ばれています。

つまりPythonでモジュールを使う時にやっているのは「このモジュール(魔法書)を使いますよ!」と最初に宣言する 事。

占いプログラムに書かれていた import random というのがまさにその部分で、 import + モジュール名 でモジュールを呼び出すことができるのです。

import文を書かないという事は魔法の世界で言えば、「水の魔法書を呼び出さないまま呪文を唱えても水魔法は使えない」、そんなイメージです。

忍者も同じように巻物を口にくわえて「忍法口寄せの術!」とガマガエルを呼び、ガマガエルが使える火遁など様々な忍術を使いますよね。

どちらも同じで最初に呼び出すというステップが必ず必要で、それを忘れてしまうと使えません。

このように魔法や忍法でイメージすると、モジュールの仕組みが多少理解しやすくなると思います。


分厚い魔法書を丸ごと呼ぶ必要はない

魔法書には薄い本もあれば分厚い本もあります。
でも、分厚い魔法書の中のたった1つの呪文しか使わないのに、毎回まるごと呼び寄せる必要はないし、効率が悪いこともありますよね。

そこで便利なのが from を使う書き方です。

  • 分厚い魔法書(モジュール)を丸ごと呼び出す:
    import random
  • randomモジュールの中の使いたい呪文だけを呼び出す:
    from random import randint

ハイスクールPythonの6.5ではモジュールの便利な使い方についても書かれていますので、そちらもぜひ参考にして、初回のコラムにあった占いプログラムを「fromで呼び出す書き方」に置き換えて動くか試してみてください。


複数のモジュールを扱うには“どのモジュールか”が重要

上級魔法使いが複数の魔法を組み合わせて一気に大技を放つシーンがありますよね。
Pythonでも、同じプログラムの中で複数のモジュールを使って処理を組み合わせることができます。

ただし、魔法を複数使うときほど
「どの魔法書に載っていた呪文なのか」
が大事になります。

だからPythonではimportでモジュールを呼び出した場合は

  • モジュール名.関数名
    例:random.randint()

という、どのモジュールの関数なのかわかるように“住所付き”の書き方をする必要があります。この書き方があれば複数のモジュールを呼び出すプログラムであっても、わかりやすいですよね。
「関数」というのはモジュールを魔法書に例えた時、その中に書かれているひとつひとつの魔法の事。これが「関数」です。

この関数が沢山集まった集合体が「モジュール」で、そのモジュールの集合体が「ライブラリ」です。

※関数にはモジュール呼び出さないと使えないものと、呼び出さなくても使えるものの2パターンがあります

モジュールを使う時のルール

モジュールを使う時のルールをまとめると、

  • 最初にどのモジュールを使うか宣言をする必要がある
  • importでモジュールを呼び出して、関数を使う場合は、「モジュール名.関数名」と書いて使う

このどちらかが欠けてしまうと、NameError(名前が見つからないよ!)というエラーになってプログラムが止まってしまいます。

randomモジュールを使ってHIGH&LOWゲームを改造する

モジュールの存在を何となくでも理解できたでしょうか?

それでは今回学んだモジュールを使って、HIGH&LOWゲームにランダムな数字が出るように改造していきましょう。

randomモジュールの中にはランダムを扱う関数がいくつかありますが、その中から random.sample を使った書き方を紹介したいと思います。

import random

# 1〜13の範囲から重複なしで2枚のカードを引く
now_card, next_card = random.sample(range(1, 14), 2)

# プレイヤーに予想を聞く
print(f"今のカードは {now_card} です。")
player_guess = input("次のカードは HIGH か LOW か?(大文字で入力): ")

# 入力チェック
if player_guess not in ("HIGH", "LOW"):
    print("予想は HIGH か LOW で入力してください!")
else:
    # 結果判定 ※条件によって代入する値を変える書き方です
    result = "HIGH" if next_card > now_card else "LOW"

    print(f"次のカードは {next_card} でした。")

    if player_guess == result:
        print("あなたの勝ち!")
    else:
        print("あなたの負け…")

ここがポイント!

random.sample(range(1, 14), 2) という一行には、幾つかのルールが隠れています。

  • range は魔法使いが「魔法書なしでも最初から使える基本技(組み込み関数)」

print や input と同じで、Pythonに初めから組み込まれている関数です。だからimport しなくてもそのまま使えます。

  • random は「魔法書の技(モジュール関数)」

これは import random という魔法書を呼び出して初めて使える技です。だから random. という「住所」をつけて呼び出します。

  • range(1, 14) の範囲に注意!

このrange()関数は、終わりの数字はカウントされません。range(1, 14) というのは1から始まり、14の手前まで、つまり「1から13まで」を作る関数です。

  • result = “HIGH” if next_card > now_card else “LOW” という書き方は、1行で書けるif文で三項演算子という書き方です。

今までよりもコードを読むのが難しい箇所があるかもしれませんが、まずはこのコードをGoogle Colabで実行してみてください。前回と違って、毎回予測不能なランダムな数字になって、ゲーム性が一気に上がったと思います。

次は、random.sample を randint の書き方に変えても同じように動くか、ぜひ試してみてください。

モジュールと条件分岐を使ってガチャを作る

実はこのrandomモジュールと条件分岐を使うとゲームでよくあるガチャも作れます。

はじめにランダムに0.0〜1.0 の乱数を変数に入れます。

そして、ガチャの出現率は R70%、SR20%、SSR10%とした場合、条件は3パターンに分かれます。

それぞれの条件に確率を入れていき結果を出力すると、ガチャの完成です。

まずは正解を見ずに復習を兼ねて自力でガチャプログラムを作ってみてください。

書き方は色々あるので、どの書き方でなければいけないというのはありませんが、参考例を一つご紹介します。

import random

r = random.random()  # 0.0〜1.0 の乱数を取得

if r < 0.7:
    result = "R"
elif r < 0.9: # 0.7 + 0.2 = 0.9 つまりここが20%の枠
    result = "SR"
else:
    result = "SSR"

print(f"結果は {result} です!")

今回のプログラムではrandomモジュールのrandom関数というものを使いました。

モジュールと関数の名前が同じ?と思うかもしれませんが、モジュール名と関数名やクラス名などが同じ名前になることは、Pythonではよくあります。

(クラスとは何か?に関しては、別のコラムで改めて解説したいと思います)

最初はややこしいと思うかもしれませんが、このようなモジュールと関数の組み合わせは試験にもよく出る部分なので、一度しっかり覚えてしまえば点数を稼ぎやすい部分になります。

ややこしいというだけで難しくはないので、最初のうちに覚えてしまいましょう。

モジュールをどういう呼び出し方をしているかによっても違ってくるので、そこもきっちり理解していく必要があります。

Pythonのモジュールはとても沢山あるのですが、その中には便利なモジュールも沢山あるので、このコラムでも色々なモジュールを紹介していきたいと思います。

最後までお読みいただき、ありがとうございました。

それではまた次回お会いしましょう!

PAGE TOP