Pythonのfunctools.partialで学ぶ部分関数(部分適用)の基本と活用術
誰もが再利用しやすいコードを書きたいと思うものです。そんなときに覚えておくと便利なのが「部分関数(Partial Function)」です。部分関数を使うと、複数の引数を持つ関数から、引数の一部をあらかじめ固定した、より少ない引数で呼び出せる新しい関数を簡単に作り出せます。
functools.partialとは?
Pythonでは、標準ライブラリのfunctoolsモジュールに含まれるpartial()を使うことで、部分適用(部分的な関数適用)を実現できます。
以下は、operatorモジュールのadd関数と組み合わせたシンプルな例です。
>>> from functools import * >>> from operator import * >>> add(1, 2) 3 >>> add1 = partial(add, 4) >>> add1(6) 10 >>> add1(10) 14
この例では、partial(add, 4)によって「最初の引数が4に固定されたadd関数」であるadd1が生成されています。add1(6)は実質的にadd(4, 6)と同じ意味になり、結果として10が返されます。
partialは高階関数
partialは、mapやfilterと同じく「関数を引数に取る高階関数」です。さらに、戻り値として返されるのも関数なので、プログラム内の他の関数とまったく同じように扱えます。
>>> list(map(add1, [1, 2, 3, 4, 5])) [5, 6, 7, 8, 9] >>> seven = partial(add1, 3) >>> seven() 7
このように、mapと組み合わせてリストの各要素に一括処理を適用したり、さらにpartialを重ねて引数を段階的に固定したりすることも可能です。
オブジェクトのメソッドにも使える
partialはオブジェクトのメソッドに対しても利用できます。たとえば、デフォルトの置換文字列を持つ文字列操作関数を作る例を見てみましょう。
>>> str1 = "Hello, Python"
>>> helloStr = partial(str1.replace, "Python")
>>> helloStr("Tutorialspoint")
'Hello, Tutorialspoint'
>>> helloStr("Java")
'Hello, Java'
ここではstr1.replaceメソッドの第1引数(置換対象)を「Python」に固定した新しい関数helloStrを作成しています。呼び出す側は置換後の文字列だけを渡せばよいため、コードがすっきりします。
部分関数が役立つ場面
- 同じオブジェクトや関数に対して、さまざまな入力値を順番に適用したいとき
- 関数の特定の引数を定数として束縛(バインド)しておきたいとき
- コールバック関数に追加の引数を渡したいとき
このように、部分関数の適用は非常に強力なツールです。Pythonのfunctools.partialを上手に活用すれば、コードを簡潔に書けるだけでなく、保守性の高いプログラムを作ることができます。
-
Pythonのissubset()関数とは?部分集合の判定方法を実例付きで解説
本記事では、Python標準ライブラリに用意されているissubset()関数の仕組みと使い方について詳しく解説します。 issubset()メソッドは、あるセット(集合)のすべての要素が、引数として渡した別のセットにも含まれている場合にブール値のTrueを返し、1つでも含まれていない要素があればFalseを返します。 下の図では、BはAの部分集合です。もしAとBが同一のセットであれば、両者は互いに部分集合の関係にあるといえます。つまり、両方のセットがまったく同じ要素を持っているということを意味します。 構文 <set 1>.issubset(<set 2>) 戻り値
-
Pythonのintersection()関数とは?集合の共通要素(積集合)を求める方法
この記事では、Pythonのセット(集合)に対して実行できるintersection()関数について詳しく解説します。数学における「積集合(インターセクション)」とは、2つの集合から共通する要素を見つけ出すことを指します。構文<セット名>.intersection(<セットa1>, <セットa2>, …)戻り値引数として渡されたすべての集合に共通する要素(積集合)が、新しいセットとして返されます。使用例set_1 = {t,u,t,o,r,i,a,l} set_2 = {p,o,i,n,t} set_3 = {t,u,t} # 2つの集合の積集合 print