Pythonにおけるライブラリーと外部pyファイルの利用と関数による再利用化方法についてまとめる。
- 関数化
- 外部pyファイルの読み込み
- 自作ライブラリー化
1. 関数化
def name_function(第1引数,第2引数,……) のように自作アルゴリズムを関数化することができる。アルゴリズムの内容はこのコードの次の行にインデントを1段下げて入力する。下記のコード例では、正規分布の平均値と標準偏差を指定し、確率密度を積分することで正規分布中のある区間[μ-3σ,μ+3σ]に入る確率を算出する関数をmain()で呼び出しターミナル上に結果を表示している。※この例ではグローバル変数を使用して複数の関数上のパラメータを設定しているが、本来はグローバル変数をあまり使用しない方が良いとされている。PythonではC言語のように#defineが使用できないため、このような形で対応した方が良い場合もある。
# コード
# ファイル名:my_tmp.py
import numpy as np
import sys
# グローバル変数
resolution = 100000 # 区分求積法による積分値近似値の精度に関する値
# 正規分布(平均値, 標準偏差 )
# input: mu = (float)(平均値), sigma = (float)(標準偏差)
# output: normal_distribution = (float)(正規分布の確率密度)
# caution: 積分しないと確率にはならない
def f01_n(mu, sigma, x):
coefficient = (1 / (np.sqrt(2 * np.pi)* sigma) )
normal_distribution = coefficient * np.e ** ( -1*( pow((x - mu), 2) / (2 * pow(sigma, 2)) ) )
return normal_distribution
def f02_integral_f01_n(x1, x2, mu, sigma):
resolution_local = resolution
width_delta = (x2-x1)/resolution_local
value_init = x1 + width_delta/2
value_ndp = 0.0
# 区分求積法:短冊の数は(分割数-1)[個]
for i in range(0, resolution_local-1):
value_ndp += f01_n(mu, sigma, value_init + (int)(i)*width_delta)*width_delta
return value_ndp
def f03_integral_x():
resolution_local = resolution
width_delta = (20-0)/resolution_local
value_init = 0 + width_delta/2
value_x = 0.0
# 区分求積法:短冊の数は(分割数-1)[個]
for i in range(0, resolution_local-1):
value_x += (value_init + (int)(i)*width_delta)*width_delta
return value_x
def main():
print(r"my_tmp.pyが実行されています。")
mu_0 = 0.6 # 正規分布の平均値
sigma_0 = 0.03 # 正規分布の標準偏差
xx1 = mu_0 - 3 * sigma_0 # 積分する区間の小さい方
xx2 = mu_0 + 3 * sigma_0 # 積分する区間の大きい方
result = f02_integral_f01_n(xx1, xx2, mu_0, sigma_0)
# result = f03_integral_x()
print(result)
return 0
# エントリポイント:ここからプログラムはスタートする
if __name__ == "__main__":
sys.exit(main())
2. 外部pyファイルの読み込み
import を使用して、同一階層にあるpyファイルは次のように呼び出すことができる。
# コード
# ファイル名:main.py
import my_sub
print(r"この出力はmain.pyからのものである。")
# コード
# ファイル名:my_sub.py
print(r"これはmy_sub.pyから呼び出されたprint()で出力された文字列である。")
出力結果は下記の通り。
これはmy_sub.pyから呼び出されたprint()で出力された文字列である。
この出力はmain.pyからのものである。
3. 自作ライブラリー化
1節で紹介したプログラムのファイル名をmy_tmp.pyとすると、2節で紹介した通り、import my_tmpで呼び出すことができるが、このとき関数は他のライブラリーと同様に (ライブラリー名).関数名(引数) の形で呼び出すことが可能である。このときmy_tmp.py内の if name == “main”: のコードにより、main()は無視されるため、プログラムが意図せず、二重に実行されることはない。
# コード
# ファイル名:main_call_tmp.py
import sys
import my_tmp
def main():
print(r"main_call_tmp.pyが実行されています。")
mu_0 = 0.6 # 正規分布の平均値
sigma_0 = 0.03 # 正規分布の標準偏差
xx1 = mu_0 - 3 * sigma_0 # 積分する区間の小さい方
xx2 = mu_0 + 3 * sigma_0 # 積分する区間の大きい方
result = my_tmp.f02_integral_f01_n(xx1, xx2, mu_0, sigma_0)
print(result)
result = my_tmp.f03_integral_x()
print(result)
return 0
# エントリポイント:ここからプログラムはスタートする
if __name__ == "__main__":
sys.exit(main())
EOF