Translate

自分の作った関数をpythonで読み込んで使えるようにするためには【python】[def]

これまでの記事でも、いろいろとpythonで使った処理を紹介していますが、何気ない感じで関数で表現することが多かったですが、実際に関数をどうやって使うのかについてはほとんど紹介していなかったです。

関数を使って別ファイルでまとめていくと、コードの中身のかなり圧縮できて、可読性の高いスクリプトになるので関数をマスターをするのは非常に有意義です。


今回は簡単ではありますが、自作で作った関数を実際に自分のスクリプトで用いるための方法について紹介していこうとおもいます。


関数はdef関数を使う



自作の関数を作る場合にはdef関数を使います。この関数はこれまでの記事でもちょこちょこ出てきていました。

例えばこんな感じの構文です。
import numpy as np 
import math
from numpy import linalg as LA
d_vec =np.array([1,0]).reshape(1,-1)
def calangle(data1,d_vec):

    Ang = np.zeros([len(data)])    
    for t in range(0,len(data)):
        d = data[t,:]
        n_d = LA.norm(d)
        dot =np.dot(d_vec,d)/n_d
        acos = np.arccos(dot)
        Ang[t] = math.degrees(acos)
    return Ang
    

これは、前に紹介した角度計算の際に作ったときの関数です。def関数の構成は、主に引数と戻り値という二つの要素によって成り立っています。

簡単にいうと、引数は関数内で計算処理したい生データとなります。例えば座標データから角度を計算したいといった場合でいう、座標データがそれに相当します。

今度は戻り値というものになるのですが、こちらに関しては、先ほどの例でいうところの角度データに相当します。戻り値はdef関数内でいうところのreturnに続く部分になります。

このdef関数は、同じスクリプト内で書いている場合には、そのスクリプト内で何度も使うことができます。毎回十数行書いていたコードを一行に圧縮できる点が利点です。


別なスクリプトからdef関数を読み込む場合

一つのdef関数くらいだったら、同じスクリプト内に書いておくので事足りるのですが、実際にいろいろな処理を含んだコードになってくると、同じスクリプトにdef関数を書いていると結果的に長くて冗長なコードになってしまいます。

大体def関数はインポート文の後に記載することが多いので、関数が多くなればなるほど、本文のスクリプトにたどり着くまでに長くなり、見ずらい文章になってしまいます。

そのため、def関数だけを書いたスクリプトを別に用意し、numpyとかscipy見たいにコードの先頭部分でインポートすることで、さらにコードの量を圧縮することができます。

インポートの方法はこんな感じです。

例えば、先ほどの角度計算の関数を別のpyファイルからインポートする場合を例にしましょう。


import numpy as np 
import math
from ○○←pyファイル名 import calangle
    
○○の部分は、def関数を記載したpyファイル名になり、それに続くインポート以降の部分は、自分で定義した関数名を入力します。今回の場合は、calangleという名前でdef関数を作成したので、それを入力します。

これを行うことで、この構文以降の文では、自分で定義したdef関数を使用することが可能になり、関数+引数を入れることで一行で処理することができます。

これのいい所は、いくら関数の数が増えたとしても、メインのスクリプトで増える構文は、このインポートの部分だけという点です。しかも同じファイル名から複数の関数をインポートする場合には、カンマで区切って同時にインポートすることができるので、分量としては、かなり短くなるといえるでしょう。

このdef関数の使い方を覚えると、自分で作った関数だけではなく、githubやstackoverflowなどで例として紹介されている関数も自分のスクリプトに容易に追加できるようになるので、自分のスクリプトの拡張性が格段に向上します。

頻回に使うようになった文がメインスクリプトの中で出てくるようになったら、積極的に関数化するとよいでしょう。