3.3. 関数#
関数(function)とは、ある値を入力として受け取り、その値に対して処理を行い、結果を返す仕組みのことです。例えば、これまでに紹介した len
や max
、min
などは、Python に標準で備わっている関数の一例です。同じ処理を何度も繰り返す場合、繰り返し構文を使う方法もありますが、処理がまとまっているなら関数として定義しておくことで、より効率的かつ便利にプログラムを作成できます。
関数に入力される変数のことを引数(argument)と呼びます。また、Python に標準で用意されている関数は、組み込み関数(intrinsic function, built-in function)といいます。
ここでは、繰り返し構文を利用して、クヌギのどんぐりの重さの平均値を計算してみましょう。
kunugi = [5.28, 6.77, 5.42, 6.03, 6.00]
Show 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]
Show 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
)のリストが異なるだけで、他の部分のコードはほとんど同じであることがわかります。しかし、リストごとにコードをコピー&ペーストして使い回す必要があるため、もし元のコードに誤りがあった場合は、そのすべてを修正しなければなりません。
そこで、「平均値を計算する」という処理を関数としてまとめてみましょう。この例では、変化するのはリストの名前(kunugi
や mizunara
)だけで、それ以外の処理は共通しています。そこで、リストの部分を変数(ここでは 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}\) は次式で表される比のことです。
n
が与えられたとき、第 n
次の貴金属比を出力する関数を作成してください。なお、\(n\) に 1、2、3 のときは、それぞれ黄金比(golden ratio)、白銀比(silver ratio)、青銅比(bronze ratio)といいます。