On Thu, 20 Oct 2011 19:09:42 -0700, Yingjie Lan wrote: >> Here's an example of an explicit request to revive the generator: > > >>>>> g = (x*x for x in range(3)) >>>>> for x in g: print x >> 0 >> 1 >> 4 >>>>> g = (x*x for x in range(3)) # revive the generator for x in g: >>>>> print x #now this will work >> 0 >> 1 >> 4 >> >> ChrisA > > > What if the generator is passed in as an argument when you are writing a > function? That is, the expression is not available?
If the expression is not available, how do you expect to revive it? The expression is gone, it no longer exists. As you said in another post: "What if the generator involves a variable from another scope, and before re-generating, the variable changed its value." Exactly. In general, you *can't* revive general iterators. It simply isn't possible. The variables that defined it might be gone. They might be non-deterministic: random numbers, data from the Internet or a file system that has changed, or user input. Trying to enforce the rule "iterators must support restarting" is foolish: it can't be done. You use an iterator when you want to iterate over something *once*, that is why they exist. If you want to iterate over it twice, don't use an iterator, use a sequence. Forcing all iterators to save their data, on the off-chance that maybe somebody might want to iterate over it twice, defeats the purpose of an iterator. > Secondly, it would be nice to automatically revive it. For example, when > another for-statement or other equivalent is applied to it. Nice? No, it would be horrible. It goes against the basic concept of an iterator: iterators should be memory efficient, generating values lazily. If you want an iterable sequence that you can iterate over multiple times, then use a list, or a custom iterable class. If you want a socket wrench, use a socket wrench. Don't insist that hammers have to have a socket wrench attachment. -- Steven -- http://mail.python.org/mailman/listinfo/python-list