Итеративность в Python - PullRequest
4 голосов
/ 16 марта 2009

Я пытаюсь понять итеративность в Python.

Как я понимаю, __iter__() должен возвращать объект, для которого определен метод next(), который должен возвращать значение или вызывать исключение StopIteration. Таким образом, я написал этот класс, который удовлетворяет обоим этим условиям.

Но, похоже, это не работает. Что не так?

class Iterator:
    def __init__(self):
        self.i = 1

    def __iter__(self):
        return self

    def next(self):
        if self.i < 5:
            return self.i
        else:
            raise StopIteration

if __name__ == __main__:
    ai = Iterator()
    b  = [i for i in ai]
    print b

Ответы [ 5 ]

9 голосов
/ 16 марта 2009

Ваш класс Iterator правильный. Вы просто опечатка в этом утверждении:

if __name__ ==' __main__':

В строке '__main__' есть первые пробелы. Вот почему ваш код не выполняется вообще.

4 голосов
/ 16 марта 2009

Я думаю, что в большинстве случаев может быть достаточно написать функцию генератора , которая использует yield вместо написания полноценного итератора.

4 голосов
/ 16 марта 2009

i никогда не станет больше 5, если вы не увеличите его в next()

1 голос
/ 16 марта 2009

Ваш текущий код работает. Вместо этого я покажу вам еще несколько итераторов / генераторов.

самое простое встроенное с точно вашим поведением.

Iterator2 = xrange(2,5)

Прямой перевод вашего класса на генератор

def Iterator3():
    i = 1
    while i < 5:
        i += 1
        yield i

генератор, составленный из генераторов в стандартной библиотеке python

import itertools
Iterator4 = itertools.takewhile( 
                        lambda y : y < 5, 
                        itertools.count(2) )

простое выражение генератора (не очень захватывающее ...)

Iterator5 = ( x for x in [2, 3, 4] )
0 голосов
/ 19 марта 2016

Ваш код имеет две проблемы:

  • if name == '__main__': (пропущенные кавычки)
  • def next . . .: вы не увеличиваете i нигде
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...