Anjanesh Lekshminarayanan wrote:
But how come a raise StopIteration in the next() method doesnt need to
be caught ? It works without breaking.

The for-loop looks for and catches StopIteration. It is an essential part of what defines a finite iterator. (Note, in 3.0, next is renamed __next__ in conformance with all other special methods. In 2.6, the rename is optional, I believe.)

class twoTimes:
    max = 10**10

    def __init__(self, n):
        self.__n = n

There is no reason to mangle the attribute name.
Max should be a parameter, and self.max = max added to the init.


    def next(self):
        if self.__n > self.max:
            raise StopIteration
        self.__n *= 2
        return self.__n

Are you sure you do not want to return once the initial value of n passed to init?

    def __iter__(self):
        return self

Once you understand the above, you can rewrite it as a generator function:

def two_times(num, stop):
  while num < stop:
    yield num
    num *=2

The two last lines can be switches if desired.

t = twoTimes(5)
c = 0

print (t.next())
print (t.next())

for n in t:
    print n

>>> print(list(two_times(5,687)))
[5, 10, 20, 40, 80, 160, 320, 640]

Terry Jan Reedy

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to