5. モジュール#

モジュールとは、Pythonのプログラムが記述されたテキストファイル(拡張子は.py)である。モジュールの主な使い方は以下の3つである。

  1. コマンドラインからスクリプトとして実行する

  2. 他のモジュールやJupyter Notebookから利用する

  3. (標準も含めて)インストールされているモジュール利用する

まず、2と3を紹介し、その後1を紹介する。

5.1. 他のモジュールの取り込み#

別のファイルに書かれているPythonプログラムを利用するには、import文を使う。例えば、以下のソースコードがoptim.pyというファイルに書かれていて、実行しているJupyter Notebookと同じディレクトリにそのファイルが置かれているとする。

def bisection(func, a, b, eps=1e-8):
    while True:
        x = (a + b) / 2
        fx = func(x)
        if -eps < fx < eps:
            return x
        fa = func(a)
        if fx * fa < 0:
            b = x
        else:
            a = x

def newton_raphson(func_f, func_g, x=0, eps=1e-8):
    while True:
        fx, gx = func_f(x), func_g(x)
        if -eps < fx < eps:
            return x
        x -= fx / gx        

このソースコードでは、bisectionとnewton_raphsonという2つの関数が定義されており、それぞれ二分法とニュートン・ラフソン法を実装している。optim.pyに書かれているbisection関数を呼び出すとき、何もせずにbisection関数を呼び出すとエラーになる。

def f(x):
    return x ** 2 + 2 * x - 3

bisection(f, -2, 2)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/tmp/ipykernel_2611/130988965.py in <module>
      2     return x ** 2 + 2 * x - 3
      3 
----> 4 bisection(f, -2, 2)

NameError: name 'bisection' is not defined

optim.pyのプログラムをインタプリタに取り込むには、import文を使う。このとき、optim.pyで定義されている関数や変数は先頭にoptim.を付けることでアクセスできる(optimという名前空間で取り込まれる)。

import optim

optim.pyのbisection関数はoptim.bisectionという名前で呼び出すことができる。

def f(x):
    return x ** 2 + 2 * x - 3

optim.bisection(f, -2, 2)
1.0

同様に、optim.pyのnewton_raphson関数はoptim.newton_raphsonという名前で呼び出すことができる。

def f(x):
    return x ** 2 + 2 * x - 3

def g(x):
    return 2 * x + 2

optim.newton_raphson(f, g, 0)
1.000000000000002

5.1.1. fromを使ったインポート#

先ほどの方法では、optim.pyで定義されている関数がoptimという名前空間に取り込まれた。名前空間を付けずに、関数をそのまま(現在の名前空間に)取り込むには、from文を用いる。以下は、optim.pyのbisection関数を取り込む例である。

from optim import bisection

すると、optim.pyで定義された関数をそのまま(optim.なしで)呼び出すことができる。

bisection(f, -2, 2)
1.0

newton_raphson関数は現在の名前空間に取り込まれていないので、呼び出すことができない。

newton_raphson(f, g, 0)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/tmp/ipykernel_2611/3347386978.py in <module>
----> 1 newton_raphson(f, g, 0)

NameError: name 'newton_raphson' is not defined

optim.pyのbisection関数、newton_raphson関数を現在の名前空間に取り込む。

from optim import bisection, newton_raphson
newton_raphson(f, g, 0)
1.000000000000002

optim.pyの全ての識別子(関数や変数など)を取り込む。

from optim import *
newton_raphson(f, g, 0)
1.000000000000002

5.1.2. 名前空間の変更#

import文を呼び出したとき、通常はモジュールのファイル名が名前空間となるが、それを変更するにはasを使えばよい。

import optim as opt
opt.bisection(f, -2, 2)
1.0
opt.newton_raphson(f, g, 0)
1.000000000000002

5.2. インストールされたモジュールの利用#

Pythonには標準でインストールされているモジュール(Python標準ライブラリ)がある。これらのモジュールを利用するときもimport文を用いる。

以下は、mathモジュールをインポートして、\(\sqrt{2}\)を計算する例である。

import math

math.sqrt(2)
1.4142135623730951

5.3. コマンドラインからの実行#

Jupyter Notebookやその前身のIPython Notebookが登場する前までは、Pythonのプログラムを.pyのファイルに記述し、コマンドライン等から実行することが基本であった。例えば、以下のソースコードがoptim2.pyというファイルに書かれているとする。

def bisection(func, a, b, eps=1e-8):
    while True:
        x = (a + b) / 2
        fx = func(x)
        if -eps < fx < eps:
            return x
        fa = func(a)
        if fx * fa < 0:
            b = x
        else:
            a = x

def newton_raphson(func_f, func_g, x=0, eps=1e-8):
    while True:
        fx, gx = func_f(x), func_g(x)
        if -eps < fx < eps:
            return x
        x -= fx / gx
        
if __name__ == '__main__':
    print(bisection(f, -2, 2))
    print(newton_raphson(f, g, 0))

このプログラムを起動したときに実行する処理は、if __name__ == '__main__':のブロック以下に記述する。このプログラムをコマンドラインから実行するには、

python optim2.py

とすればよい。Jupyter Notebook上でコマンドを実行するには、先頭に!を付ければよい。

!python optim2.py
1.0
1.000000000000002