Python のメソッドの作り方

関数の作り方

Python で関数オブジェクトを定義する際に def コマンドを利用する。平均や分散などを計算する際に、NumPy や SciPy で用意されたメソッドを利用すればよいが、独自のアルゴリズムで計算したい場合などは、関数を一からつくり上げる必要がある。

基本的な作り方

関数は、def に続いて関数名とコロンを書き、その次の行をインデントし、関数の処理を書く。例えば、2 つの引数(xy)を受け取り、その差を返す関数は次のように作成する。ただし、関数は dis とする。

def dis(x, y):
    sa = x - y
    return(sa)

自作した関数 dis は以下のように利用する。

dis(30, 10)
## 20

dis(y = 10, x = 30)   
## 20

関数を利用するにあたって、引数が足りないときにエラーが発生する。例えば、dis 関数の場合、2 つ目の引数 y を省略すると、以下のようなエラーが発生する。

dis(30)
## Traceback (most recent call last):
##   File "<stdin>", line 1, in <module>
## TypeError: dis() missing 1 required positional argument: 'y'

関数の引数に初期値を設定する方法

関数の引数に初期値を設定することができる。初期値が設定された関数が呼び出されると、引数が与えられていないは初期値を利用するようになる。例えば、次の関数では 、引数 x が与えられていない場合は x = 30 として初期化を行い、引数 y が与えられていない場合は y = 0 として初期化を行う。

def dis(x = 30, y = 0):
    sa = x - y
    return(sa)

dis(20)
## 20

dis()
## 30

複数個の値を返す方法

関数は 1 つの値をしか返せない。複数の値を返す必要がある場合、リストあるいはディクショナリにして返す。

def plus_and_minus(x, y):
    a = x + y
    b = x - y
    c = [a, b]
    return(c)

z = plus_and_minus(20, 10)
print(z)
## [30, 10]

再帰処理

関数の中で自分自身を呼び出すことを再帰という。再帰を必要とする処理には、例えばフィボナッチ数列を計算するアルゴリズムなどがあげられる。

def fib(n):
    if n > 1:
        return fib(n - 1) + fib(n - 2)
    else:
        return 1

fib(5)
## 8

参照渡し

Python の関数に引数として渡されるオブジェクトは基本的に参照渡しになる。つまり、関数の内部で、そのオブジェクトに変更を加えていたら、関数を抜けても、その変更した後のオブジェクトが残る。

def add_M(x):
    x.append('M')
    return x

def add_N(x):
    y = x
    y.append('N')
    return y


a = ['A', 'B', 'C']

print(a)
## ['A', 'B', 'C']

add_M(a)
print(a)
## ['A', 'B', 'C', 'M']

add_N(a)
print(a)
## ['A', 'B', 'C', 'M', 'N']

値渡し

関数の引数として渡されたオブジェクトが関数内で変更されても、その関数を抜けた時にその変更されないようなことにしたい場合、オブジェクトを変更する前にコピーをとる。

import copy

def add_M(x):
    y = copy.deepcopy(x)
    y.append('M')
    return y

def add_N(x):
    y = copy.deepcopy(x)
    z = y
    z.append('N')
    return z


a = ['A', 'B', 'C']

print(a)
## ['A', 'B', 'C']

b = add_M(a)
print(a)
## ['A', 'B', 'C']
print(b)
## ['A', 'B', 'C', 'M']

b = add_N(a)
print(a)
## ['A', 'B', 'C']
print(b)
##['A', 'B', 'C', 'N']