Screwing Up looping in Generator

Deborah Swanson python at deborahswanson.net
Tue Jan 3 18:21:10 EST 2017


 

-----Original Message-----
From: Matt Wheeler [mailto:m at funkyhat.org] 
Sent: Tuesday, January 03, 2017 1:47 PM
To: python at deborahswanson.net; Sayth Renshaw; python-list at python.org
Subject: Re: Screwing Up looping in Generator


On Tue, 3 Jan 2017 at 20:17 Deborah Swanson <python at deborahswanson.net>
wrote:

> What's the code for your generator? And I don't see where you
> call 'next'.

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.




Yes, you absolutely can expect a for statement to do that. It will
accept any iterable as its `y`. 
 
>> And here is someone correcting me, which I sort of suspected there
might be. Yes, 
>> range is an iterator, but I didn't know a generator could also be
used as an iterator.  
>> Makes perfect sense though, a generator does dispense its yields in
the sequence 
>> defined by the generator.


`for x in y: stuff(x)` is effectively syntactic sugar for:


iterator = iter(y)
while True:
    try:
        x = next(iterator)
    except(StopIteration):
        break
    stuff(x)

Manually calling `next()` inside a `while True:` is quite an unusual
thing to do. 
 
>> And you don't need to do it very often. The only use case I know is
this one, where the number of yields the generator can output is unknown
(here, the number of files the generator can access is unknown). You
might recall that the original poster wanted to use a while, but didn't
know how to terminate it. At least that's how I interpreted what he was
saying.


range() is not part of the for syntax at all, it's completely separate,
it simply returns an iterator which the for loop can use, like any
other. 
--  
 
>> I see that now, I just didn't know a generator could be used as an
iterator.

--
Matt Wheeler
http://funkyh.at



More information about the Python-list mailing list