-----Original Message----- From: Matt Wheeler [mailto:m...@funkyhat.org] Sent: Tuesday, January 03, 2017 1:47 PM To: pyt...@deborahswanson.net; Sayth Renshaw; python-list@python.org Subject: Re: Screwing Up looping in Generator
On Tue, 3 Jan 2017 at 20:17 Deborah Swanson <pyt...@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 -- https://mail.python.org/mailman/listinfo/python-list