Cameron <ca**********@gmail.comwrites:
I was reading this <a href="this http://www.paulgraham.com/icad.html">Paul
Graham article</aand 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