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