On Wednesday 01 April 2015 00:18, Albert van der Horst wrote:
> In article <[email protected]>,
> Steven D'Aprano <[email protected]> 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