Re: accumulator generators



On May 31, 4:19 am, Arnaud Delobelle <arno...@xxxxxxxxxxxxxx> wrote:
Cameron <cameronla...@xxxxxxxxx> 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
.



Relevant Pages

  • Re: Self function
    ... Python ... giving the programmer the ability to have a function refer to ... def parrot: ...     print inspect.getmembers ...
    (comp.lang.python)
  • Re: What c.l.pys opinions about Soft Exception?
    ... Actually, the latter is even less cluttered, misses a raise - if pure number ... Exception that aren't handled when no handler exists for it. ...     raise_soft ... def a_equal_b: ...
    (comp.lang.python)
  • Re: multiprocessing question/error
    ...     def calcula: ... def m1: ... from multiprocessing import Process, Pool ... def m2(self, arg): ...
    (comp.lang.python)
  • Re: How to launch a function at regular time intervals ?
    ...     func.start ... from datetime import datetime ... """Write timestamp in a file every 10 seconds in separate ... def stop: ...
    (comp.lang.python)
  • Re: question of style
    ...     if self.lower is None: ... values- Iterate through the values in sort order. ... def insert: ...
    (comp.lang.python)