結論から言うとコールバック関数というのは
コールバック関数とは、コンピュータプログラム中で、ある関数などを呼び出す際に引数などとして引き渡される別の関数。
コールバック関数とは
もっと端的にいうならば、引数として使われる関数ですね。
いや、わかるかい。なんやそれ。どうやって使うんや。笑
具体例を見ていきましょう。
サンプルコード
def callback_add(a, b):
print('{} + {} = {}'.format(a, b, a + b))
def callback_times(a, b):
print('{} × {} = {}'.format(a, b, a * b))
def handler(a, b, callback):
callback(a, b)
if __name__=='__main__':
handler(3, 5, callback_add)
handler(3, 5, callback_times)
3 + 5 = 8
3 × 5 = 15
ここで、callback_add, callback_timesがコールバック関数です。
ちなみに、コールバック関数を呼び出す関数はhandlerと記述されることが多いらしいです。
コールバック関数のメリットは、関数の呼び出し側であらかじめ決めた処理を渡せることらしいです。
はぁ・・・・。
・・・いまいち使い道が分かりづらい。
いつ使うねん!!!!!!!ってツッコミたくなりますね。笑
ということでもう一歩踏み込んでみましょう。
Callback関数を使わなかった場合の例
def f1():
name = 'Mike'
say_hello(name)
def say_hello(name):
print(name, 'さん,こんにちは!')
def say_bye(name):
print(name, 'さん,さようなら!')
def f2():
name = 'Mike'
say_bye(name)
if __name__=='__main__':
f1()
f2()
Mike さん,こんにちは!
Mike さん,さようなら!
もしCallback関数を使わずに、f1の中にsay_helloがあるというロジックを組んだ場合、違うことをこの名前で言いたい時にまた新しいf2を作らないといけなくなります。そして増やせば増やすほど、f3,f4と増えていきます。これはとても不便です。こんな時にCallback関数を使うんですね。
def f1(callback):
name = 'Mike'
callback(name)
def say_hello(name):
print(name, 'さんこんにちは!')
def say_bye(name):
print(name, 'さんさようなら!')
if __name__=='__main__':
f1(say_hello)
f1(say_bye)
上は同じ例だけど、Callback関数を使った場合です。
めちゃくちゃ綺麗ですね・・・・。
どんだけ増やしてもf1で納まり、say_〇〇の関数を増やせばいいだけです。
まだピンと来てない方は、上下のコードと睨めっこしてみてください。
そして手でなぞりながら考えたらわかると思います。
Callback関数を覚えれば、関数の幅がとても広がりますね。