On May 31, 4:19 am, Arnaud Delobelle <[EMAIL PROTECTED]> wrote: > Cameron <[EMAIL PROTECTED]> 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 -- http://mail.python.org/mailman/listinfo/python-list