accumulator generators

Arnaud Delobelle arnodel at googlemail.com
Sat May 31 04:19:12 EDT 2008


Cameron <cameronlarue at gmail.com> writes:

> I was reading this <a href="this http://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
>>> 

-- 
Arnaud



More information about the Python-list mailing list