revive a generator
Steven D'Aprano
steve+comp.lang.python at pearwood.info
Sat Oct 22 01:39:59 EDT 2011
On Fri, 21 Oct 2011 16:25:47 -0400, Terry Reedy wrote:
> Here is a class that creates a re-iterable from any callable, such as a
> generator function, that returns an iterator when called, + captured
> arguments to be given to the function.
>
> class reiterable():
> def __init__(self, itercall, *args, **kwds):
> self.f = itercall # callable that returns an iterator
> self.args = args
> self.kwds = kwds
> def __iter__(self):
> return self.f(*self.args, **self.kwds)
>
> def squares(n):
> for i in range(n):
> yield i*i
>
> sq3 = reiterable(squares, 3)
We can do that even more simply, using a slightly different interface.
>>> from functools import partial
>>> sq3 = partial(squares, 3)
sq3 is now an iterator factory. You can't iterate over it directly, but
it's easy to restart: just call it to return a fresh iterator.
>>> list(sq3())
[0, 1, 4]
>>> list(sq3())
[0, 1, 4]
--
Steven
More information about the Python-list
mailing list