・コールバック関数って何??高階関数って何??と質問されて答えられない方
・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つがなんなのか分からなくなってきますよね。
今回のコールバック関数と高階関数も、しっかりそれぞれどういう関数なのか
説明できるようになれたら良いなと思い、勉強させていただきました。
ここまで読んでいただき、ありがとうございました。