Screwing Up looping in Generator
python at deborahswanson.net
Tue Jan 3 00:01:18 EST 2017
Erik wrote, on January 03, 2017 3:45 PM
> On 03/01/17 22:14, Deborah Swanson wrote:
> > ...you have to create the generator object first and use it to call
> > the next function. And I really don't think you can use a
> generator as
> > your range in a for loop. So I'd use a 'while True', and
> break out of
> > the loop when you hit the StopIteration exception:
> > files = rootobs()
> > while True:
> > try:
> > file = files.next()
> > except StopIteration:
> > break
> > base = os.path.basename(file.name)
> > .
> > .
> > .
> > (etc)
> What you have done there is taken an understanding of the underlying
> machinery that allows the 'for' loop to be syntactic sugar over any
> iterable and spelled it out, instead of just using 'for'! Without all
> that, your example is:
> for file in rootobs():
> base = os.path.basename(file.name)
> [In fact, the machinery would also cope with the return value from
> rootobs() being an iterable but not an iterator by using "files =
> You seem to be reading up on how the stuff works under the
> covers (i.e.,
> from the point of view of an implementer of a class or
> library) and then
> suggesting that that's what the *caller* of that class or
> library needs
> to do. They don't - for a caller, 'for x in seq:' is all they need to
> know - the mechanics are handled by the interpreter coupled with the
> dunder methods that the class may implement.
Ok, I'm in complete agreement with everything you said up to the last
paragraph, which I don't disagree with, I just don't see your point.
If you've read my last few posts you'll have seen me acknowledging that
normally a for loop is used, but a while and break on StopIteration is a method
that's useful when the output of the generator is unknown.
I haven't read through much documentation on generators, but I have taken a
course from MIT, in which a Computer Science professor gave us several methods
for working with generators, of which the while and break on StopIteration
method is one. The original poster wanted to use a while, and seemed to be
saying he didn't know how many files the generator he has would yield, so that
was why I recommended the while loop. Normally I would use a for loop too. D.
More information about the Python-list