Pythonic function composition

Oliver Fromme olli at haluter.fromme.com
Mon Oct 25 11:26:02 EDT 2004


Alan G Isaac <aisaac at american.edu> wrote:
 > Given a list of functions, it seems there must be a
 > Pythonic approach to composition.  Something like
 > 
 > def compose(fns): return lambda x: reduce(lambda f,g: f(g),fns)(x)
 > 
 > This will not work because the argument 'x' is not "inside".
 > What is the proper formulation?

There are probably several ways to do it.
The following is the one which come to my mind first.

The trick is to first define a function that composes
two functions, and then use reduce() to apply it to an
arbitrary number of functions.

>>> def compose2 (f, g):
...   def h (x):
...     return f(g(x))
...   return h
...
>>> def compose (fns):
...   return reduce(compose2, fns)
...

Some testing:

>>> def add42 (x): return x + 42
...
>>> def mul2 (x): return x * 2
...
>>> def sub5 (x): return x - 5
...
>>> def div3 (x): return x / 3
...
>>> a = compose((add42, mul2, sub5, div3))
>>> a(1)
27

There's no need to juggle with lambda in this case.
Lambda has its uses, but this isn't one of them.

Best regards
   Oliver

-- 
Oliver Fromme, Konrad-Celtis-Str. 72, 81369 Munich, Germany

``All that we see or seem is just a dream within a dream.''
(E. A. Poe)



More information about the Python-list mailing list