関数の合成(compose)は、複数の関数を組み合わせて新しい関数を作る手法です。Python には組み込みの compose 関数はありませんが、簡単に実装できます。
基本的な実装
2 つの関数を合成する例です。
def compose(f, g): return lambda x: f(g(x)) def add_one(x): return x + 1 def double(x): return x * 2 add_then_double = compose(double, add_one) print(add_then_double(5)) # 12 (5+1=6, 6*2=12)
compose(f, g) は「まず g を適用し、その結果に f を適用する」関数を返します。数学の記法 f ∘ g と同じ順序です。
複数の関数を合成する
functools.reduce を使って任意個の関数を合成できます。
from functools import reduce def compose(*funcs): return reduce(lambda f, g: lambda x: f(g(x)), funcs) def add_one(x): return x + 1 def double(x): return x * 2 def square(x): return x ** 2 pipeline = compose(square, double, add_one) print(pipeline(3)) # 64 (3+1=4, 4*2=8, 8**2=64)
パイプライン形式
右から左への適用が直感的でない場合は、左から右へ適用する pipe を作ることもできます。
def pipe(*funcs): return reduce(lambda f, g: lambda x: g(f(x)), funcs) pipeline = pipe(add_one, double, square) print(pipeline(3)) # 64
関数の合成を活用すると、データ変換の流れを宣言的に記述でき、各ステップを独立してテストしやすくなります。