accumulator generators

George Sakkis george.sakkis at gmail.com
Sat May 31 10:54:56 EDT 2008


On May 31, 4:19 am, Arnaud Delobelle <arno... at googlemail.com> wrote:
> Cameron <cameronla... at gmail.com> writes:
> > I was reading this <a href="thishttp://www.paulgraham.com/icad.html">Paul
> > Graham article</a> and he builds an accumuator generator function in
> > the appendix. His looks like this:
>
> > <pre>
> > def foo(n):
> >   s = [n]
> >   def bar(i):
> >     s[0] += i
> >     return s[0]
> >   return bar
> > </pre>
>
> > Why does that work, but not this:
>
> > <pre>
> > def foo(n):
> >   s = n
> >   def bar(i):
> >     s += i
> >     return s
> >   return bar
> > </pre>
>
> Others have explained why, but this looks like "pythonized LISP" to
> me.  I would rather use a generator function:
>
> def foo(n):
>     while True:
>         n += yield n
>
> Although the problem is that you can't send it values the first time
> round!
>
> >>> bar = foo('s')
> >>> bar.next()
> 's'
> >>> bar.send('p')
> 'sp'
> >>> bar.send('am')
>
> 'spam'
>
> But:
>
> >>> bar = foo(3)
> >>> bar.send(2)
>
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> TypeError: can't send non-None value to a just-started generator

I find the "pythonized LISP" solution more understandable, even
without the initial next() requirement. YMMV

George



More information about the Python-list mailing list