【Python Tips】自作関数のつくり方とインポートして使う方法(モジュール化・パッケージ化・ライブラリ化)
ナカジ(@cp_nakajun)です。
Pythonに限らず、プログラミングで何かをしようとすると「同じような記述(処理)を何回も書く」ようなことがあります。
例えば、ある「家族A」「家族B」「家族C」があって「それぞれの家族の年齢の合計を求める」プログラムを作るような場合(そんなニーズはまぁないけど)
この場合家族の人数もそれぞれの年齢もバラバラですが、やることは単純に足し算ですし、足し算部分は「共通」の処理です。
この時、2~3家族程度ならコピペで増やすこともできますが対象が20~30、100など増える程に面倒くさいですし、読みにくく汚いプログラムになっていきます。
(間違いも起こりやすく、修正も大変、応用も使いまわしもできない)
さらに複雑な処理になればなるほど、この傾向は強くなります。
プログラムにするからには自作関数として外部に置き、呼び出して使いまわすべきです。
ということで、今回は
- 自作関数のつくり方
- 自作関数をインポートして使う方法
です。
Python 自作関数のつくり方
関数を定義するには「def」を使います。
書き方は
def 関数名(引数1,引数2,...): #ここに関数の処理を記述 return 戻り値
という感じで書きます。
サンプルとして以下のように自作関数を作った場合
def unit1(in_1,in_2): cal_1 = in_1 + in_2 return cal_1
- unit1という関数名で呼びだします
- in_1とin_2は引数です
- in_1 + in_2がcal_1に代入されます
- cal_1の値が呼び出し元にかえります
呼び出し方、関数の使い方は
out1 = unit1(2,4)
こうするとunit1の関数は足し算なのでout1には「6」が代入されます。
Python 自作関数をインポートして使う方法
自作関数を作ったら名前をつけて保存します。
サンプルとして以下のような関数を作り「my_Tools.py」と名前をつけて保存します。
[my_Tools.py]
#足し算 def unit1(in_1,in_2): cal_1 = in_1 + in_2 return cal_1 #掛け算 def unit2(in_1,in_2): cal_2 = in_1 * in_2 return cal_2
掛け算をする「unit2」も作りました。
メインプログラム(呼び出し側)を「main.py」とします。
「main.py」と「my_Tools.py」が同じ階層のディレクトリにある場合は
普通に
import my_Tools
とすればよいです。
[main.py]
import os import my_Tools input_a = 2 input_b = 4 out1 = my_Tools.unit1(input_a,input_b) out2 = my_Tools.unit2(input_a,input_b) print(out1) print(out2)
実行すると、out1の「6」とout2の「8」が結果として表示されます。
Python 自作関数のモジュール化
上記の「my_Tools.py」には「unit1」と「unit2」という2つの関数が定義されてます。
このように他のPythonのプログラムから呼び出して使う「.py」のpythonプログラムをモジュールと呼びます。
- my_Tools.py:モジュール
- unit1:関数
- unit2:関数
Python 自作関数のパッケージ化
先のサンプルのように「main.py」に対して読み込むモジュールが1つの場合は「main.py」と「my_Tools.py」が同じ階層のディレクトリにあっても特に不便はないでしょう。
メインプログラムの名前が「main.py」でない場合にどちらがメインプログラムかわかりにくいぐらいでしょうか。
これがモジュールが増えてきた場合などモジュールをまとめて別のディレクトリに置いて管理したくなると思います。
pythonではメインと同じディレクトリにフォルダーを作り、そこに入れたモジュールをインポートするには単純に「import module.py」ではインポートできません。
その場合はパッケージ化する必要があります。
パッケージとは単純にモジュールの集まりのことです。
他の言語ではライブラリという言葉がよく使われていますが、Pythonではあまり使われることは無いようです。
パッケージ作成方法
なんか難しそうに感じますが、Pythonでパッケージを作るのは簡単です。
まずモジュールを一つのフォルダ(ディレクトリ)に入れてまとめます。
次にPythonに「このフォルダはパッケージですよ」と認識させるために
そのフォルダに[__init__.py]というファイルを作成します。
中身は空です。
これでこのフォルダはパッケージ化されます。
パッケージ内モジュールの使い方
パッケージ化をすることで別のディレクトリに置いたモジュールを利用できるようになります。
その方法は
from パッケージ名 import モジュール名
このパッケージ名はいわゆる「ディレクトリ名」です。
例えば以下のような階層構造の場合
-[workspace]
–main.py
–[self_made_module]
—my_Tools.py
メインからmy_Toolsをインポートするには
from self_made_module import my_Tools
となります。