Python 高階関数 #4

株式会社リュディアです。ここまで高階関数という用語は別にして map, reduce, filter の使い方を見てきましたが、今回は高階関数自体についてまとめてみます。

前回までの高階関数のまとめへのリンクは以下を参考にしてください。

高階関数は引数や戻り値に関数を利用できる関数と言ってよいと思います。ただ何がうれしいのか、というのが理解し辛かったです。また高階関数を使わないと Python プログラミングで不便な状態になることも無かったです。今、現在は私個人の感覚として数学に近いプログラミングをする際に利便性を感じています。例えば数学の多変数関数で一部の変数を固定して利用する場合や、合成関数をイメージして理解できたような気がしています。

他の方にも同じ例を使うことで理解が容易になるかどうかはわからないのですが例として紹介しようと思います。

まず数学の世界で func(x, y) という2変数の関数を以下のように定義します。

func(x, y) = x^2 + 2y

関数 func(x, y) の演算計算結果を表示するプログラムは以下のようになります。

def func(x, y):
   return x**2 + 2*y

result = func(2, 3)
print(result)

# 10 ( 2^2 + 2*3 = 4 + 6 = 10)

次に数学の世界で gfunc(y) = func(2, y) と定義することを考えます。これは f(x, y) で x = 2 に固定し f(x, y) を 1 変数 y のみの関数 gfunc(y)  として再定義したものです。数学では gfunc という名前ではなくて g( ) を使うことが多いですが、ここはプログラムにあわせて gfunc(y) とします。この一連の定義の様子を高階関数を利用してプログラミングすると以下のようになります。

def func(x):
   def func1(y):
       return x**2 + 2*y
   return func1

gfunc = func(2)
result = gfunc(3)
print(result)

# 10

def func(x) の定義の内部でさらに def func1(y) を定義しています。2つの def で定義されている関数を合わせると 2 変数 x, y を持つ関数のように扱えます。gfunc = func(2) とすることで gfunc は func(x, y ) で x = 2 とした新しい関数となります。すると gfunc(3) = func(2, 3) と同じことになります。ここで私が腑に落ちたのは gfunc = func(2) の部分です。この記述で高階関数のイメージがつかめたと思っています。

次は合成関数のイメージをプログラミングしたものです。以下の2つの関数定義を見てください。

画像1

画像2

expfunc が合成関数であることはわかると思います。この様子を高階関数を使ってプログラミングしてみます。以下の例を見てください。

import math

# e^func(x)

def expfunc(func):
   def func1(x):
       return math.exp(func(x))
   return func1

newFunc = expfunc(math.sqrt)
result = newFunc(4)
print(result)

# 7.38905609893065

expfunc( ) という関数の引数として math.sqrt つまりルートを求める関数を渡しています。合成関数を使う場合に、より数学的に自然な記述をプログラミングでも行えるようになっていると理解しました。

今回は高階関数自体の理解の助けになるか、と思ってまとめてみましたが、いかがでしょうか。なかなか使うシーンも限られますが、頭の中にいれておくと何かのときに使ってみようと思えるかもしれません。

では、ごきげんよう。


この記事が気に入ったらサポートをしてみませんか?