On Wednesday 01 April 2015 00:18, Albert van der Horst wrote: > In article <55062bda$0$12998$c3e8da3$54964...@news.astraweb.com>, > Steven D'Aprano <steve+comp.lang.pyt...@pearwood.info> wrote:
>>The biggest difference is syntactic. Here's an iterator which returns a >>never-ending sequence of squared numbers 1, 4, 9, 16, ... >> >>class Squares: >> def __init__(self): >> self.i = 0 >> def __next__(self): >> self.i += 1 >> return self.i**2 >> def __iter__(self): >> return self > > You should give an example of usage. As a newby I'm not up to > figuring out the specification from source for > something built of the mysterious __ internal > thingies. > (I did experiment with Squares interactively. But I didn't get > further than creating a Squares object.) Ah, sorry about that! Usage is: it = Squares() # create an iterator print(next(it)) # print the first value x = next(it) # extract the second while x < 100: print(x) x = next(it) Beware of doing this: for x in Squares(): print(x) since Squares is an *infinite* generator, it will continue for ever if you let it. Fortunately you can hit Ctrl-C to interrupt the for loop at any point. In Python 2, you will need to rename __next__ to just next without the double-leading-and-trailing underscores. >>Here's the same thing written as a generator: >> >>def squares(): >> i = 1 >> while True: >> yield i**2 >> i += 1 And for this one: it = squares() # create the iterator print(next(it)) # print the first value x = next(it) # extract the second while x < 100: print(x) x = next(it) Usage is pretty much exactly the same. -- Steve -- https://mail.python.org/mailman/listinfo/python-list