Screwing Up looping in Generator

Deborah Swanson python at deborahswanson.net
Tue Jan 3 00:01:18 EST 2017


Erik wrote, on January 03, 2017 3:45 PM
>
> Hi,
>
> 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)
>    .
>    .
>    .
>    (etc)
>
> [In fact, the machinery would also cope with the return value from
> rootobs() being an iterable but not an iterator by using "files =
> iter(rootobjs)"].
>
>
>
> 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.
>
>
> E.

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 mailing list