本サイトは広告・プロモーションが含まれています
Python

【Python】コールバック関数と高階関数

この記事はこんな人におすすめ

・コールバック関数って何??高階関数って何??と質問されて答えられない方
・Pythonのコードの書き方の幅を増やしたい方
など

どうもこんにちは。
管理人のコンです。

突然なのですが
みなさんはコールバック関数と高階関数を説明できますでしょうか??
ちなみに私はできないです(泣)

現在私は、Pythonを基礎から勉強し直しております。
この内容は、自分があまり理解できてないなと感じたところだったので
今回記事にしてみました。

コールバック関数

コールバック関数とは引数として渡される関数のことです。
以下にシンプルなコールバック関数を使ったコードを書きます。

def double(x):
    return x*2

def do_calc(num, action):
    return action(num)

def main():
    print(do_calc(3, double))

main()
#6という数字が出力されます。


上の例ではdo_calcという関数に、actionという関数を引数(コールバック関数)として渡しています。
つまり
do_calc(num, doubule) => double(num)
となってdounbel(3)の返り値である6が出力されます。

もう少し別の例をみてみます。

def double(x):
    return x*2

def do_calc(num, action):
    return action(num)

def main():
    #xは変数
    x = double
    print(do_calc(3, x))

main()
#これも6が出力されます。


上のコードはxという変数に関数doubleを代入してます。
関数を変数として扱うことができるのがPythonの特徴でもあります。

高階関数

高階関数とは、
関数を引数として扱う関数
・関数を返り値として扱う関数
・上記2つの性質を両方もつ関数
のことを指します。

今回は関数を引数として扱う高階関数についてお話しいたします。

map関数


まずは関数を引数として扱う関数の紹介をします。
それがmap関数なのですが、また簡単なコードで紹介します。

def double(x):
    return x*2

def main():
    data = [1, 2, 3, 4, 5]

    #for文を使った一般的な方法
    result_for = []
    for i in range(len(data)):
        result_for.append(double(data[i]))
    print("result_for", result_for)

    #map関数を使った方法
    result_map = list(map(double, data))
    print("result_map", result_map)

#実行
main()

#以下の結果がでます。
#result_for [2, 4, 6, 8, 10]
#result_map [2, 4, 6, 8, 10]


上のコードは[1, 2, 3, 4, 5]のリストを関数doubleを使って、各要素を2倍にするというものです。
Pythonがある程度わかるかたなら、for文を使って各要素をdouble関数の引数にするのですが
map関数を使うと、それが1行で実行できます。

またmap関数のポイントは
引数のデータの次元数と返り値のデータの要素数が同じという点です。

filter関数


map関数は引数と返り値のデータの要素数が同じでしたが、
引数のうち、条件を満たしたものだけを返り値として返す関数も存在します。
それがfilter関数になります。

def get_even(x):
    return x%2 == 0

def main():
    data = [1, 2, 3, 4, 5]

    #for文を使った一般的な方法
    result_for = []
    for i in range(len(data)):
        if get_even(data[i]):
            result_for.append(data[i])
        
    print("result_for", result_for)

    #filter関数を使った方法
    result_filter= list(filter(get_even, data))
    print("result_map", result_filter)

#実行
main()

上のコードは[1, 2, 3, 4, 5]のリストを関数get_evenを使って、偶数の要素だけを抽出するいうものです。
この関数も、filter関数を使って1行で実行できます。

おわりに


プログラミングを勉強しているといつも〜関数という名前がどんどん出てきて
1つ1つがなんなのか分からなくなってきますよね。

今回のコールバック関数と高階関数も、しっかりそれぞれどういう関数なのか
説明できるようになれたら良いなと思い、勉強させていただきました。

ここまで読んでいただき、ありがとうございました。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA