iterative lambda construction

Jack Diederich jack at performancedrivers.com
Mon Feb 21 16:33:06 EST 2005


On Mon, Feb 21, 2005 at 01:14:00PM -0800, Paul Rubin wrote:
> "markscottwright" <markscottwright at gmail.com> writes:
> > But when I try to do it iteratively, it just hangs when I try to
> > evaluate the results (for count > 1):
> > 
> > def repeated2(f, count):
> >     newfun = f
> >     for i in range(count-1):
> >         newfun = lambda x: newfun(f(x))
> >     return newfun
> > 
> > For the life of me, I can't figure out why.  It seems like for count =
> > 2, for example, the results from repeated2 should be lambda x: f(f(x)),
> > but it doesn't seem to be.
> 
> It's Python's scoping madness.  Try:
> 
>   def repeated2(f, count):
>      newfun = lambda x: x   # identity
>      for i in range(count):
>          newfun = lambda x, g=newfun: g(f(x))
>      return newfun

Ahh, but not sufficienty evil or pernicious.

def evil(f, count):
  def apply_evil(accum, func):
      return func(accum)
  def pernicious(x):
    return reduce(apply_evil, [f]*count, x)
  return pernicious

def f(x):
    return x+x

print evil(f, 3)(2)

More seriously I'd go without the recursion and just make a wrapper
that applies the function count times in a wrapper.

def benign(f, count):
  def wrap(x):
    result = f(x)
    for (i) in range(count-1):
      result = f(result)
    return result
  return wrap

print benign(f, 3)(2)

-Jack



More information about the Python-list mailing list