python_learn

2-7:関数

前ページ(2-6:データ型) | 目次へ戻る | 次ページ(2-8:クラス)


ここまで色々とPythonのソースコードを書いてきましたが、複雑なものを作っていくとその分ソースコードも長くなっていくことを体感してきたと思います。

また同じ処理を何度か行いたい場合、同じものを何度も書くのは非常に非効率です。

そんな時に活躍するのが本ページで扱う関数になります。

関数の書き方

関数を簡単に言うと「処理をまとめたもの」で、書き方は以下のようになります。

def [関数名]():
    [処理]

この関数を作成することを「関数を定義する」と言います。

そしてその関数を使いたい場合は以下のように書きます。この関数を使うことを「関数を呼び出す」と言います。

例えばhoge関数を定義し、呼び出す場合は以下のようにします。

# hoge関数を定義
def hoge():
    print("hoge")

hoge() # hoge関数の呼び出し

また関数には「引数」と「戻り値」を設定することができます。

言葉 意味
引数 呼び出す関数内の処理で扱う渡したい値
戻り値 呼び出す関数内の処理結果の値

また書き方としては以下のようになります。

# 引数x, yとしてadd関数を定義
def add(x, y):
    result = x + y # 足し算
    return result  # 計算結果を戻り値として返す

a = 2
b = 3

answer = add(a, b) # add関数の呼び出して結果を変数answerに入れる
print(answer)      # 計算結果の5が表示される

ここまで書くと今まで無意識に使っていた「print」が「引数を与えることによってその値を表示する」関数であることがわかったかと思います。

関数の利点

はじめに少し書きましたが、関数を使う利点は以下のように色々とあります。

まず同じ処理を複数回書かなくてよいですが、例えば「2-3:四則演算の練習問題」で台形の面積を計算するコードを書きましたが、問題で高さや上底、下底の値が変化した場合を考えてみてください。

upper, lower, heightの変数を毎回書き換え、計算式も同じものを何度も書いて…という形に今までならしていたと思いますが、関数を使えば引数を変更して都度呼び出せばよいだけです。

# 台形の面積計算の関数を定義
def calc_trapezium(upper, lower, height):
    answer = (upper + lower) * height / 2 # 台形の面積 = (上底 + 下底) * 高さ / 2
    return answer

# 計算して表示
print(calc_trapezium(12, 27, 18))
print(calc_trapezium(5, 2, 3))
print(calc_trapezium(120, 43, 10))

次に機能ごとにまとまってソースコードが読みやすくなるですが、ソースコードは長くなればなるほど理解しにくいものになります。

ですが、処理をできるだけ小さく関数ごとにまとめておくことにより、関数は関数内だけの処理を意識すればよくなるため、理解しやすくなります。

要は小分けされた関数を一つ一つ理解していき、それらを組み合わせることで最終的にソースコード全体を理解するという方法がとれるという形になります。

また関数の中で別の関数を呼び出すこともできます。

def hoge():
    print("hoge")


def call_hoge():
    print("call")
    hoge()

call_hoge()

関数分けの考え方

どの処理を関数で分けるかはプログラマー毎に違っており、またセンスが問われる部分でもあります。

基本的には以下の2つを意識するのがよいかと思います。

基本的には「処理が長くなるようなら関数に分ける」ようにすればよいです。

あくまで目安ですが、一つの関数はディスプレイに一度に表示できる行数(30~40行程度)にするのが良いようです。この行数を超えるとソースコードを理解しにくくなるのと、画面をスクロールさせないといけないので全体を一度に見渡せなくなります。

また「同じ処理は関数化する」ですが、これは合理化という面もありますがそれ以上に「バグの発生を軽減する」という意味合いもあります。

例えば同じ処理をいくつも書いていたところにその処理に対する修正が発生すると、それら全てを修正しなければなりません。そうするとどこかで修正漏れがあるとそれがバグになります。

しかし関数にしておくと、その関数のみの修正で済むので修正漏れの確率が低くなります。

このように関数の分け方次第でソースコードの読みやすさやメンテナンスのしやすさが変わってくるので、関数をどのように分けるかは意識しておきましょう。

練習問題

2-6の練習問題で作成した「bを抜いた平均点を計算する」処理を関数に分けてください。

解答例 ・2-07_01_function_practice.py

# bを抜いた平均点を計算する関数
def calc_average(list_key, list_value):
    list_size = len(list_key) # 両方同じサイズなので片方のサイズを取得

    point_dict = {} # 空の辞書

    # リストのサイズ分繰り返して辞書を作成
    for i in range(list_size):
        point_dict[list_key[i]] = list_value[i]

    print(point_dict) # 作成した辞書を表示

    sum   = 0 # 合計値の変数
    count = 0 # 繰り返し回数の変数

    for key, value in point_dict.items():
        if key == 'b':
            continue

        sum = sum + int(value) # 点数がstrなのでintに変換して足す
        count = count + 1

    average = sum / count # 合計を繰り返し回数で割って平均を出す
    print(average)


key_list   = ['a', 'b', 'c', 'd']
value_list = ['49', '52', '6', '91']

# 関数を呼び出す
calc_average(key_list, value_list)

前ページ(2-6:データ型) | 目次へ戻る | 次ページ(2-8:クラス)