LoginSignup
0
0

More than 3 years have passed since last update.

[光-Hikari-のPython]08章-01 モジュール(モジュールのインポート)

Last updated at Posted at 2020-06-25

[Python]08章-01 モジュールのインポート

06章でオリジナルの関数を自作しました。こういった自作した関数はほかの人に使用してもらうことも可能です。
自分で作成した、複数の関数を1つのファイルにまとめることができ、このファイルのことをモジュール(部品)と言います。

実際には世界中のPythonプログラマがで作成した様々なモジュールがインターネットで公開されています。こういったモジュールは無償で使用することができ、インポート(import)して使用します。

公開されているものには、AIやIoTなどで使用するモジュールや、ゲームの作成、データ分析などで使われるモジュールなど様々なものがあります。

この章では、まず自分で作成したモジュールのインポート、そしてインターネット上に作成されているモジュールのインポートについて説明していきます。

自作モジュールのインポート

実際に自作の関数をいくつか作り、モジュールとして保存してみましょう。
まず、モジュールを作成するのですが、まだchap08は作成せず、以下の[python]直下に作成をしてください。(以下のように[python]を右クリックする)
image.png

そして、sampmod08_01というファイル名で保存してください。(sampmod08_01です。sampmod08-01ではありません。→モジュールファイル名で-ハイフンを使用すると読み込めません)

sampmod08_01.py
def my_func():
    print('モジュール内の関数から実行しています。')

def calc_func(x, y):
    return x**2 + y

my_func()
print(calc_func(3, 3))

次に、chap08を新たに作成し、その中に、samp08-01-01.pyというファイル名でファイルを作成し、以下のコードを書いてください。そして、samp08-01-01.pyのほうを実行してください。

samp08-01-01.py
import sampmod08_01

【実行結果】
モジュール内の関数から実行しています。
12

import文により、自分で作成したモジュールsampmod08_01.pyが読み込まれ、それが実行されます。

なお、これはPython Consoleでも実行は可能です。Python Consoleから以下のコードを入力してください。

>>> import sampmod08_01
モジュール内の関数から実行しています
12

Python Consoleでimportしても、同じ結果が出力されることが分かったかと思います。
Python Consoleで実行後は、必ず以下をクリックしてストップさせてください。(インポートされたままとなってしまうためです)
image.png
image.png

インポートした関数の呼び出し

今度は先ほどのモジュールを少し変更します。先ほどと同じく、[python]直下sampmod08_02というファイル名を作成してください。
そして以下のコードを入力してください。

sampmod08_02.py
def my_func():
    print('モジュール内の関数から実行しています。')

def calc_func(x, y):
    return x**2 + y

今回は、呼び出し元の関数をモジュール内に作成していません。これをモジュール外から関数を呼び出すことを考えます。chap08の中に、samp08-01-02.pyというファイル名でファイルを作成し、以下のコードを書いてください。そして、samp08-01-02.pyを実行してください。

samp08-01-02.py
import sampmod08_02

sampmod08_02.my_func()
print(sampmod08_02.calc_func(3, 3))

【実行結果】
モジュール内の関数から実行しています。
12

今回、モジュール内には呼び出し元はなく、samp08-01-02.pyの中に呼び出し元があります。ほかのモジュールにある関数を呼び出す際には、

呼び出すモジュール名.呼び出すモジュール内の関数

といった形式で呼び出すことができます。

モジュールに別名を付ける方法

先ほど、ほかのモジュールにある関数を呼び出す際に、sampmod08_02.my_func()sampmod08_02.calc_func(3, 3)として呼び出しましたが、モジュール名が長く、入力に時間がかかってしまいます。

こういう時によく利用されるのがasを使って、別名を指定する方法です。

import 呼び出すモジュール名 as 別名モジュール

chap08の中に、samp08-01-03.pyというファイル名でファイルを作成し、以下のコードを書いてください。そして、samp08-01-03.pyを実行してください。

samp08-01-03.py
import sampmod08_02 as sm0802

sm0802.my_func()
print(sm0802.calc_func(3, 3))

【実行結果】
モジュール内の関数から実行しています。
12

モジュールの別名を指定することで、少し短いモジュール名になったかと思います。よく、AIで使用するを外部から読み込むときは、別名を指定することが多いです。

また、よく見ると、前回のモジュールを使いまわしています。いちいち、新たにモジュールを作らなくとも、モジュールを再利用している様子がわかると思います。
これがモジュールの利点とも言えます。

fromによるインポート

インポートをすると、ほかのモジュールにある関数を実行できることはわかりました。
さらに別名を指定することについても触れました。しかし、どのみちsm0802.my_func()といった、モジュール名(別名)をいちいち指定しなければならないのは大変です。

そこで、インポートする際にfromを使用することで、それを解消できます。一般的には以下のように指定します。

from モジュール名 import 関数名1, 関数名2

実際に書いてみましょう。先ほどのsampmod08_02をインポートしてみます。今回はPython Consoleから実行してみます。

>>> from sampmod08_02 import my_func
>>> my_func()
モジュール内の関数から実行しています
>>> sampmod08_02.calc_func(3, 10)
19

まず、fromでモジュール名を読み込み、さらにimportmy_func関数を読み込んでいます。そうすることで、sampmod08_02.my_func()と指定しなくとも、my_func()のみで関数の呼び出しができます。

なお、importの個所には、calc_funcを指定してないため、これを呼び出すにはsampmod08_02.calc_func(3, 10)とする必要があります。

<補足>__name__ == '__main__'について

この__name__ == '__main__'については、あまり実務上では見かけたことはないのですが、もしかしたら基本情報技術者試験では出題される可能性があり、このコードを見てもあわてないようにしてほしいという意味で記述しておきました。

まず、samp08-01-01.pyで書いた以下のプログラム、

sampmod08_01.py
def my_func():
    print('モジュール内の関数から実行しています。')

def calc_func(x, y):
    return x**2 + y

my_func()
print(calc_func(3, 3))

について、このモジュールをインポートすると、以下のように実行されることを確認しました。

>>> import sampmod08_01
モジュール内の関数から実行しています
12

ところが、動作確認などのため、インポートしてもモジュール内の関数を呼び出させないようにすることもできます。逆に、モジュール自体を実行したときに、出力させることもできます。
[python]直下sampmod08_03というファイル名を作成してください。
そして以下のコードを入力してください。

sampmod08_03.py
def my_func():
    print('モジュール内の関数から実行しています。')


def calc_func(x, y):
    return x**2 + y


if __name__ == '__main__':
    my_func()
    print(calc_func(3, 4))

これをPython Consoleにインポートしてみてください。Python Consoleから以下のコードを入力してください。(おそらくなにも出力されないことを確認できると思います。)

>>> import sampmod08_03

これは、インポートをするといきなり関数を呼び出さないように、if文で__name__ == '__main__'の条件を書いて、その個所をスルーすることができます。

この関数を実行させるには、Python Consoleでインポートされたモジュール内の関数を指定して実行する必要があります。。

>>> import sampmod08_03
>>> sampmod08_03.my_func()
モジュール内の関数から実行しています
>>> sampmod08_03.calc_func(3,5)
14

また、先ほどの、sampmod08_03.pyについては、直接実行すると、以下のように出力されます。これはsampmod08_03.pyというモジュールを主(main)として実行しているため、if文内の関数呼び出しが可能となるのです。(実行結果で、calc_func関数の結果が異なっているのを確認できます。)

【実行結果】
モジュール内の関数から実行しています。
13

最後に

今回は自分で作成したモジュールをインポートすることについて触れました。モジュールのインポートはこれから、AIやIoT関連のプログラムを作成する際には当たり前のように必ず出てくるものです。
まだ外部のモジュールやライブラリ(後述します)の読み込みは触れていませんが、同じようなimport形式で読み込むので、今後に向けて押さえておきましょう。

【目次リンク】へ戻る

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0