Pythonはその起源からすると関数型言語ではない。しかし、functoolsライブラリを利用することで、関数型言語のスタイルでプログラムを記述できるようになる。関数型のコードを記述するために重要なツールの一つとして、functoolsモジュールでも利用可能な「関数の部分適用」がある。

部分適用とは、ある関数への複数の入力のうち一つを定数値にバインドし、残りの入力のみを受け取る新しい関数を作成することである。バインドされた入力は、新しく作成された関数が呼び出される際にはいつも同じ値になる。以下に、functoolsモジュールを用いた部分関数の簡単な使用例を紹介しよう。なお、この例ではoperatorモジュールのadd関数も使用している。このadd関数は「+」演算子と同様の働きをするものの、関数であるためオブジェクトとしても扱うことが可能だ。

>>> from functools import * >>> from operator import * >>> add(1,2) 3 >>> add1 = partial(add, 1) >>> add1(2) 3 >>> add1(10) 11

partial関数はいわゆる高階関数であり、入力として関数を一つ受け取る（高階関数には、ほかにmap関数やfilter関数がある）。ただし、ほかの関数とは異なって、partial関数は戻り値としても関数を返す。このとき返されるのは、ほかの関数と同様にプログラム内で使用可能な関数だ。add1関数は、引数を一つ受け取るほかの関数とまったく同様に利用することが可能なのである。呼び出しはもちろん、以下のようにmap関数の引数として使用したり、もう一度部分適用することすら可能なのだ。

>>> map(add1, [1,2,3,4,5]) [2, 3, 4, 5, 6] >>> five = partial(add1, 4) >>> five() 5

partial関数はオブジェクトのメソッドに対して使用することも可能である。たとえば、以下の例ではデフォルトの文字列を持ったリストを生成するためにpartial関数を使用している。

>>> standard = "User N" >>> usern = partial(standard.replace, "N") >>> usern("1") 'User 1' >>> usern("1202") 'User 1202'

次ページではより本格的な例をお見せしよう。