Python基礎講座(14 モジュールとパッケージ)

## モジュール
コードを記述して、他のプログラムから再利用できるようにしたファイルのことを「モジュール｣と言います。
自分でPython言語を使用して開発する通常のモジュールの他にも
* Pythonにデフォルトで組み込まれている「組み込みモジュール｣
* C言語など他の言語で開発された「拡張モジュール」
があります。この章では通常のモジュールと組み込みモジュールを説明します。

### 通常のモジュール
フィボナッチ数列という有名な数列があります。
**0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, …**
という数列ですが、ある法則を持ちます。

**0 + 1 = 1
1 + 1 = 2
1 + 2 = 3
3 + 5 = 8
5 + 8 = 13 …**

見て分かるように、N個目の数値とN+1個目の数値の和がN+2個目の数値になっています。
与えた引数までのフィボナッチ数列を求める関数が書かれているモジュールfibonatti.pyを作成してみましょう。

```py3:fibonatti.py
def fibo(n):
    result = []
    a = 1
    b = 1

    while b < n:
        result.append(b)
        val = a + b
        b = a
        a = val
    return result

if __name__ == "__main__":
    print("{0}".format(fibo(100)))
```

プログラムの最後に書いてある
```if __name__ == "__main__":```
は、「このモジュールが(他のプログラムから呼び出されたのではなく)自身が実行された場合」
という意味があります。モジュールは他のプログラムから呼び出されて使用するものですが、
正しく動作するかをテストをするテストが当然必要です。
このif文の中でfibo関数を呼び出して、正しく動作することを確認したならばモジュールの完成です。

作成したモジュールを別のプログラムで使用したプログラムは以下になります。

```py3:print_fibo.py
import fibonatti

print("{0}".format(fibonatti.fibo(100)))
```

モジュールを読み込むには**import** *モジュールファイル名* と先頭に記述します。
利用する場合は*モジュール名.メソッド名()*で使用できます。

Pythonは(Pythonの開発者を含む)世界中のプログラマにより便利なモジュールがたくさん作成されていて、
それらを利用することで高度で便利なプログラムを簡単に作成することが出来ます。感謝しましょう。
多くの便利なモジュールが用意されている点がPythonが人気の言語である理由の1つと言えるでしょう。

ここでは便利なモジュールであるmathモジュールを紹介します。
mathモジュールは数学関数計算で使用する数値や関数が用意されています。

```py3:math_explain.py
import math

print("pi = {0}".format(math.pi))
print("floor(5.2) = {0}".format(math.floor(5.2)))
print("ceil(5.2) = {0}".format(math.ceil(5.2)))
```
実行結果は以下になります。

**pi = 3.14159265359
floor(5.2) = 5.0
ceil(5.2) = 6.0**

piは円周率の値を返します。
floor(小数)は引数の小数以下の最大の整数を返します。
ceil(小数)は引数の小数以上の最小の整数を返します。
他にも便利な数値や関数がたくさん用意されています。

### 組み込みモジュール
これまで「Pythonの基礎」シリーズで紹介してきたプログラムの中でも組み込みモジュールは使用してきました。
* 文字列を数値に変換するint()や、数値を文字列に変換するstr()
* 最大要素を取得するmax()や最小要素を取得するmin()、長さを取得するlen()

他にもありますが、これら組み込みモジュールはインポートを必要としません。

## モジュールのインポート
先ほどフィボナッチ関数をプログラム内で使用するためにimport fibonattiと書きましたが、
モジュールをファイルで読み込み使用可能にすることをインポートと言います。
1つのモジュールをインポートするために**import** *モジュールファイル名*と書きましたが、
複数のモジュールをインポートする場合**import モジュール1,モジュール2,...**のように
カンマ区切りでインポートできます。
また、モジュール内の指定したメンバ(メンバー、つまり関数、定数、クラスのことです)だけをインポートする方法もあります。
以下のプログラムを確認して実行してください。

```py3:import_part.py
from math import cos,sin,tan

print("{0}".format(cos(1)))
```

**from** *モジュール名* **import** *メンバ,メンバ,…* で指定したメンバだけをインポートできます。
この方法でインポートしたメンバはモジュール名を付与せずに呼び出すことが出来ます。
上記のプログラムでmath.cosではなくcosのみで呼び出せています。

## パッケージ
Pythonではフォルダに**\_\_init__.py** ("\_"2つ)があれば、そのフォルダを「パッケージ」として扱えます。
\_\_init__.pyの中身は空でかまいません。
同じような機能を持つ複数のモジュールを1つのフォルダにまとめ、あるいはサブフォルダに分類して
1つの多機能なパッケージを作ることが出来ます。

![scipy.PNG](https://qiita-image-store.s3.amazonaws.com/0/64230/9cedbca1-4cf5-d1f0-dfb0-f4b9e391b773.png)

上記の画像は自分のPCにインストールした科学演算向けのモジュールを集めたscipyパッケージです。
scipyフォルダ直下に\_\_init__.pyが配置され、同じ階層に目的別にサブフォルダが作られ、
各フォルダ内にモジュールファイルが格納されています。

パッケージのインポート方法はモジュールのインポート方法同様
```import scipy```
でインポート可能です。

パッケージ内の特定のサブフォルダの全てのモジュールをインポートする方法は以下になります。
```import scipy.cluster```

パッケージ内の特定のモジュールをインポートするには**import** *パッケージ名(.サブパッケージ名).モジュール名* と記述します。
```import scipy.special.specfun```
あるいはモジュールと同じように**from** *パッケージ名* **import** *モジュール名* でもインポートできます。
```from scipy.special import specfun```

次: [Python基礎講座(15 終わりに)](http://qiita.com/Usek/items/c44391198d33c55332d7)