日々ろぐ

人に優しく٩( 'ω' )و

高階関数についてざっくりまとめ

タイトルの通り。

高階関数ってなに?

wikipediaによると

第一級関数をサポートしているプログラミング言語において、関数(手続き)を引数にしたり、あるいは関数(手続き)を戻り値とするような関数のことである。

ということ。 ざっくり言ってしまうと、

  • 引数に関数がある関数
  • 関数を返す関数

というところ。

個人的なイメージでは、整数とか文字列みたいに関数を(オブジェクトのように)引数や返り値で扱うことができると思ってます。 javascriptとか描いてるとなんとなくイメージしやすいかなと。 (関数を変数に代入して、それをやりとりしてる感じに近しい)

先日描いたmap,filter,reduce高階関数の一種です。

高階関数の例

一例として、以下のような文字列を出力する関数があったとする。

def hello():
    print ("Hello World")

この文章の前後(性格には関数が実行される前後)に文字列を出力する高階関数は以下のようになります。

def outer(func):
    def inner():
        print("before execute")
        func()
        print("after execute")
    return inner()

ポイントとしては

  • outer関数の中に、innner関数を定義する
  • outer関数は関数を引数に持っている(func)
  • outer関数はinner関数を返している

このouter関数を、前述のhello関数と組み合わせて使うと

outer(hello)

>>> before execute
>>> Hello World
>>> after execute

となる。 処理の順番としては、

  1. outer関数実行
  2. outer関数がinner関数を返す
  3. inner関数を実行
  4. print("before execute")
  5. hello関数を実行(Hello World
  6. print("after execute")

という流れ。

使い所

正直、パッと思いつくのはデバッグのためのログ出力とかログイン判定とかしか思いつかない・・・。 もっといえば、ログイン判定が必要なサービスなんかだと基底クラス作って継承とかさせるだろうから、こういう感じで使うのは微妙だと思ったり。 なんか「こう使えるよ!」ってのがあれば知りたいところです。

デコレータ

高階関数呼ぶのにいちいち

outer(hello)

なんて書き方をするのは面倒だと思います。

そういう時には便利なデコレータを使いましょう。

デコレータについては別途書きます。。多分。。

--追記しました-- massyuu.hatenablog.com