関数

3.3. 関数#

関数function)とは、ある値を入力として受け取り、その値に対して処理を行い、結果を返す仕組みのことです。例えば、これまでに紹介した lenmaxmin などは、Python に標準で備わっている関数の一例です。同じ処理を何度も繰り返す場合、繰り返し構文を使う方法もありますが、処理がまとまっているなら関数として定義しておくことで、より効率的かつ便利にプログラムを作成できます。

関数に入力される変数のことを引数argument)と呼びます。また、Python に標準で用意されている関数は、組み込み関数intrinsic function, built-in function)といいます。

ここでは、繰り返し構文を利用して、クヌギのどんぐりの重さの平均値を計算してみましょう。

kunugi = [5.28, 6.77, 5.42, 6.03, 6.00]
Hide code cell content
s = 0
n = 0

for m in kunugi:
    s = s + m
    n = n + 1

ave = s / n
ave
5.9

次に、ミズナラのどんぐりの重さについても、同じように平均値を計算してみましょう。

mizunara = [2.80, 2.54, 2.28, 2.33, 2.41]
Hide code cell content
s = 0
n = 0

for m in mizunara:
    s = s + m
    n = n + 1

ave = s / n
ave
2.472

この 2 例を見ると、クヌギ(kunugi)とミズナラ(mizunara)のリストが異なるだけで、他の部分のコードはほとんど同じであることがわかります。しかし、リストごとにコードをコピー&ペーストして使い回す必要があるため、もし元のコードに誤りがあった場合は、そのすべてを修正しなければなりません。

そこで、「平均値を計算する」という処理を関数としてまとめてみましょう。この例では、変化するのはリストの名前(kunugimizunara)だけで、それ以外の処理は共通しています。そこで、リストの部分を変数(ここでは x)に置き換え、全体を関数として定義します。

関数は def キーワードを使い、続けて関数名を記述して作成します。関数名は自由に付けられますが、ここでは「平均を計算する」の意味で calc_avg と名付けます。そして、計算した平均値を関数の呼び出し元に返すために、return 文を使います。

def calc_avg(x):
    s = 0
    n = 0
    
    for m in x:
        s = s + m
        n = n + 1

    ave = s / n

    return ave

この関数 calc_avg は、リスト x を受け取り、その平均値を計算して return 文で ave を返します。この関数を使えば、どんぐりの重さを計算するコードがさらに簡単になります。

この関数を使うと、クヌギとミズナラのどんぐりの平均値を次のように計算できます。

kunugi_ave = calc_avg(kunugi)
kunugi_ave
5.9
mizunara_ave = calc_avg(mizunara)
mizunara_ave
2.472

このように関数を使うことで、同じ処理を何度も書く必要がなくなり、コードがすっきりと読みやすくなります。また、もし関数 calc_avg に誤りが見つかった場合でも、関数の定義部分(def calc_avg(x))を修正するだけで、関数を呼び出しているすべての場所で正しい動作が保証されます。

練習問題 SF-1

リスト x が与えられたとき、その最大値と最小値の差を計算して返す関数を作成してください。

関数は数値以外も返すことができます。例えば、入力した値が、奇数(odd)か偶数(even)かを判定して返す関数を定義することもできます。

def check_oddeven(n):
    ans = None
    if n % 2 == 1:
        ans = 'odd'
    else:
        ans = 'even'
    return ans
check_oddeven(5)
'odd'
check_oddeven(6)
'even'

同様に、ある値が 3 の倍数かどうかを判定する関数も作成できます。例えば、3 の倍数ならば True を、そうでなければ False を返すようにするのではれば次のようにします。

def is_3x(n):
    ans = None
    if n % 3 == 0:
        ans = True
    else:
        ans = False
    return ans
is_3x(5)
False
is_3x(6)
True

True または False を返す関数と条件構文を組み合わせて利用すると便利です。例えばリスト内で 3 の倍数の個数を数えるときなどに便利です。

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
n = 0
for m in x:
    if is_3x(m):
        n = n + 1

n
4

このように、関数を使うとコードの再利用性が高まり、プログラムが簡潔で読みやすくなります。また、必要に応じて関数の内部を修正するだけで、関数を使用しているすべての箇所に変更が反映されるため、メンテナンスも容易になります。

練習問題 SF-2

n が与えられたとき、その値が素数であれば True を、そうでなければ False を返す関数を作成してください。

練習問題 SF-3

\(n\) 次の貴金属比 \(M_{n}\) は次式で表される比のことです。

\[ 1 : \frac{n + \sqrt{n^{2} + 4}}{2} \]

n が与えられたとき、第 n 次の貴金属比を出力する関数を作成してください。なお、\(n\) に 1、2、3 のときは、それぞれ黄金比(golden ratio)、白銀比(silver ratio)、青銅比(bronze ratio)といいます。