メカエンジニアのためのプログラミング #011 関数化と再利用

Pythonにおけるライブラリーと外部pyファイルの利用と関数による再利用化方法についてまとめる。

  1. 関数化
  2. 外部pyファイルの読み込み
  3. 自作ライブラリー化

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

トップに戻る