2009-03-16 4 views
4

Я пытаюсь понять Iterability в Python.Итерабельность в 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 
+0

Вам нужно "__main__" в кавычках –

+0

есть опечатка , Это должно быть self.i + = 1 , а не i + = 1 – Cybis

+0

Ваш текущий код, похоже, работает, есть ли еще проблема? – cobbal

ответ

1

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

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

Iterator2 = xrange(2,5) 

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

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

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

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

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

Iterator5 = (x for x in [2, 3, 4]) 
4

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

9

Ваш класс итератора является правильным. Вы просто опечатка в этом заявлении:

if __name__ ==' __main__': 

Там в ведущие пробелы в «__main__» строка. Вот почему ваш код вообще не выполняется.

4

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

+0

Да, но, как я указал, я учился :) –

0

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

  • if name == '__main__': (недостающие кавычки)
  • def next . . .: вы не увеличиваем i где-нибудь

 Смежные вопросы

  • Нет связанных вопросов^_^