functools

【Python】partial関数の使い方の基本 ~関数の部分適用~

【Python】partial関数の使い方の基本 ~関数の部分適用~

Pythonでpartial関数を使って関数の部分適用をする方法を解説します。

partial関数で関数の部分適用をする

partial関数は、関数と固定する引数の値を受け取ることで関数の部分適用をすることができる関数です。partial関数は、functoolsモジュールの中に含まれています。

このように引数に関数を受け取る関数は高階関数と言います。関数の部分適用については、関数型プログラミング言語でも重要な概念です。Pythonはマルチパラダイムの言語と言われているため、厳密ではありませんが関数型のプログラミングスタイルもサポートしており、partial関数が利用できるようになっています。

本記事では、partial関数を用いて関数の部分適用をする方法の基本について紹介します。

Note

partial関数と同じく関数型プログラミングに関連のある関数としてmap関数、filter関数、reduce関数があります。以下のページでまとめていますので興味があれば参考にしてください。

関数の部分適用とは

関数の部分適用というのは、数学やプログラミングにおいて重要な概念です。部分適用は、ある関数に対して一部の引数を固定して新しい関数を作る手続きのことを言います。これにより関数をより柔軟に再利用したり、複雑な操作をシンプルに表現することができます。

少し例を用いて考えてみましょう。以下のような数学の関数を考えます。

\begin{eqnarray}
f(x, y) = x^{y}
\end{eqnarray}

この関数は$x$を$y$乗する関数で、Pythonでも組み込みの関数としてpow(x, y)として計算することができます。ここで、$y=2$と固定して新しい関数を作ることを考え、新しい関数を$g(x)$とおくと以下のようになります。

\begin{eqnarray}
g(x) = f(x, 2) = x^{2}
\end{eqnarray}

このように元の関数$f$の一部の引数を固定して新しい関数$g$を作成するのが部分適用の基本的な考え方です。

部分適用と似たような言葉としてクロージャがありますので、関係性を整理しておきましょう。クロージャは、上位の関数の引数の値を保持したままの関数のことを言います。少し分かりにくいかもしれませんが、部分適用とクロージャの関係性としては、部分適用を行った結果がクロージャとして扱うことができるということになります。

partial関数の基本的な使い方

基本的な使い方

上記の部分適用のパートで説明した$f(x, y) = x^{y}$において、$y$を固定する例をつかって、partial関数の基本的な使い方を見ていきましょう。

from functools import partial

# pow(base, exp)においてexp=2に固定する
pow2 = partial(pow, exp=2)
# 4 ** 2 = 16
print(pow2(4))
# 5 ** 2 = 25
print(pow2(5))

# pow(base, exp)においてexp=3に固定する
pow3 = partial(pow, exp=3)
# 4 ** 3 = 64
print(pow3(4))
# 5 ** 3 = 125
print(pow3(5))
【実行結果】
16
25
64
125

関数としては、Python組み込みのpow(base, exp)を使用しています。

partial関数の呼び出しでは、「pow2 = partial(pow, exp=2)」というように関数powと固定するexp引数の値を指定しています。ここでポイントは、関数を渡す際に()がないことです。関数は、pow(4, 2)のように()で引数を指定すると関数を実行することを意味しますが、()がない場合は関数そのものを表します。partialは、受け取ったpowを関数の内部処理で使っているわけです。

返却値のpow2は、そのもの自身が引数exp=2に固定した状態のpow関数となっています。そのため、pow2(4)とすると「$4^2=16$」ですし、pow2(5)とすると「$5^2=25$」となります。

partial関数の便利なところは3乗の関数を作ろうと思ったら「pow3 = partial(pow, exp=3)」とするだけで簡単に作れることです。この場合は、pow3(4)とすると「$4^3=64$」ですし、pow3(5)とすると「$5^3=125$」となります。

今回は、組み込み関数のpowを例にしましたがもちろん独自に作った関数等でも同様のことが可能です。このようにpartial関数を用いることで、関数の部分適用を簡単に実現することができます。

まとめ

Pythonでpartial関数を使って関数の部分適用をする方法を解説しました。

partial関数は、関数と固定する引数の値を受け取ることで関数の部分適用をすることができる関数です。partial関数は、functoolsモジュールの中に含まれています。

partial関数は、map関数やfilter関数のように関数型プログラミングに関連のある関数です。Pythonはマルチパラダイムの言語と言われているため、厳密ではありませんが関数型のプログラミングスタイルもサポートしており、partial関数が利用できるようになっています。

本記事では、partial関数を使って関数の部分適用をする例を紹介しました。関数をより柔軟に再利用したり、複雑な操作をシンプルに表現する際に使用すると便利な関数のため、使い方を覚えてもらうと良いかと思います。