Screwing Up looping in Generator

Deborah Swanson python at deborahswanson.net
Tue Jan 3 17:14:50 EST 2017


Terry Reedy
> 
> On 1/3/2017 3:53 PM, Deborah Swanson wrote:
> 
> >> I think you're expecting
> >>
> >> 	for file in rootobs
> >>
> >> to get the next yield for you from rootobs, but unless someone 
> >> corrects me, I don't think you can expect a 'for' statement to do 
> >> that. You need to have a 'next' statement inside your for 
> loop to get 
> >> the next yield from the generator.
> 
> As I read this, out of context, it is wrong.  It it very 
> unusual to call 
> next on the current iterator (here next(rootobs)), inside a for loop.
> 
> > You probably want something like :
> >
> > for f in rootobs:
> >     file = next
> 
> This is definitely wrong, as it makes 'find' an alias for the next() 
> function.
> 
> >     base = os.path.basename(file.name)
> 
> and file.name will be an AttributeError.
> 
> ---
> If one wants to iterate through files and lines within files, which I 
> believe I saw in this thread, one should have a for loop 
> within a for loop.
> 
> -- 
> Terry Jan Reedy

Yes, my first attempts were screwups. I didn't remember generator usage
correctly, but I believe my last answer was correct:

...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)




More information about the Python-list mailing list