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

#[Python]08章-01 モジュールのインポート
06章でオリジナルの関数を自作しました。こういった自作した関数はほかの人に使用してもらうことも可能です。
自分で作成した、複数の関数を1つのファイルにまとめることができ、このファイルのことを**モジュール（部品）**と言います。

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

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

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

##自作モジュールのインポート
実際に自作の関数をいくつか作り、モジュールとして保存してみましょう。
まず、モジュールを作成するのですが、まだ<font color="#00cccc">chap08</font>は作成せず、以下の**[python]直下**に作成をしてください。（以下のように[python]を右クリックする）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602679/ad56d5bd-56c5-47c2-1c00-52f6b06b8123.png)

そして、<font color="#00cccc">sampmod08_01</font>というファイル名で保存してください。（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))
```

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

```.samp08-01-01.py
import sampmod08_01
```
><font color="#090" bgcolor="black">【実行結果】</font>
モジュール内の関数から実行しています。
12

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

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

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

Python Consoleでimportしても、同じ結果が出力されることが分かったかと思います。
<font color="orange">※</font>Python Consoleで実行後は、必ず以下をクリックしてストップさせてください。（インポートされたままとなってしまうためです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602679/f37d297c-aab1-355b-605e-ec3e6eab0383.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602679/5acc5de2-7740-a3de-5f80-03a01f3bf9bf.png)


##インポートした関数の呼び出し
今度は先ほどのモジュールを少し変更します。先ほどと同じく、**[python]直下**に<font color="#00cccc">sampmod08_02</font>というファイル名を作成してください。
そして以下のコードを入力してください。

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

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

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

```.samp08-01-02.py
import sampmod08_02

sampmod08_02.my_func()
print(sampmod08_02.calc_func(3, 3))
```
><font color="#090" bgcolor="black">【実行結果】</font>
モジュール内の関数から実行しています。
12

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

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

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

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

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

```.py
import 呼び出すモジュール名 as 別名モジュール
```
<font color="#00cccc">chap08</font>の中に、<font color="#00cccc">samp08-01-03.py</font>というファイル名でファイルを作成し、以下のコードを書いてください。そして、<font color="#00cccc">samp08-01-03.py</font>を実行してください。

```.samp08-01-03.py
import sampmod08_02 as sm0802

sm0802.my_func()
print(sm0802.calc_func(3, 3))
```
><font color="#090" bgcolor="black">【実行結果】</font>
モジュール内の関数から実行しています。
12

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

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

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

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

```.py
from モジュール名 import 関数名1, 関数名2…
```

実際に書いてみましょう。先ほどの<font color="#00cccc">sampmod08_02</font>をインポートしてみます。今回は**Python Console**から実行してみます。

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

まず、**from**でモジュール名を読み込み、さらに**import**で**my_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))
```
について、このモジュールをインポートすると、以下のように実行されることを確認しました。

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

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

```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**から以下のコードを入力してください。（おそらくなにも出力されないことを確認できると思います。）

```.py
>>> import sampmod08_03

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

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

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

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

><font color="#090" bgcolor="black">【実行結果】</font>
モジュール内の関数から実行しています。
13


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

###[【目次リンク】へ戻る](https://qiita.com/ko0821/items/379e8bd9e6ea01089419)