я не знаю __iter__ в Python, который может дать мне хороший пример кода - PullRequest
6 голосов
/ 24 декабря 2009

мой код работает неправильно

class a(object):
    def __iter(self):
        return 33
b={'a':'aaa','b':'bbb'}
c=a()
print b.itervalues()
print c.itervalues()

Пожалуйста, попробуйте использовать код, а не текст, потому что мой английский не очень хорош, спасибо

Ответы [ 4 ]

17 голосов
/ 24 декабря 2009

а. Правильно: не

   def __iter(self):

но:

   def __iter__(self):

с __ до и после iter.

б. Сделайте тело правильно: не

return 33

но:

yield 33

или вернуть iter ([33])

Если вы return получаете значение из __iter__, возвращаете итератор ( iterable , как в return [33], почти так же хорош, но не совсем ...); или yield 1+ значений, превращая __iter__ в функцию генератора (так что она по сути возвращает итератор генератора).

с. Назовите это правильно: не

a().itervalues()

но, например ::

for x in a(): print x

или

print list(a())

itervalues является методом dict и не имеет ничего общего с __iter__.

Если вы исправите все три (!) Ошибки, код будет работать лучше; -).

5 голосов
/ 24 декабря 2009

Несколько слов о вашем коде:

  1. __iter должно быть __iter__
  2. Вы возвращаете «33» в функции __iter__. На самом деле вы должны возвращать объект итератора . Итератор - это объект, который продолжает возвращать разные значения, когда вызывается его функция next() (возможно, последовательность значений, например [0,1,2,3 и т. Д.]).

Вот рабочий пример итератора:

class a(object):
    def __init__(self,x=10):
        self.x = x
    def __iter__(self):
        return self
    def next(self):
        if self.x > 0:
            self.x-=1
            return self.x
        else:
            raise StopIteration

c=a()

for x in c:
    print x

Любой объект класса a является объектом итератора. Вызов функции __iter__ должен вернуть итератор, поэтому он возвращает сам - как вы можете видеть, класс a имеет функцию next(), так что это объект итератора.

Когда вызывается следующая функция, она сохраняет возвращаемые последовательные значения, пока не достигнет нуля, а затем отправляет исключение StopIteration, которое (соответственно) останавливает итерацию.

Если это кажется немного туманным, я бы предложил поэкспериментировать с кодом, а затем проверить документацию здесь: http://docs.python.org/library/stdtypes.html

1 голос
/ 24 декабря 2009

Вот пример кода, который реализует встроенную функцию xrange:

class my_xrange(object):
    def __init__(self, start, end, skip=1):
        self.curval = int(start)
        self.lastval = int(end)
        self.skip = int(skip)
        assert(int(skip) != 0)

    def __iter__(self):
        return self

    def next(self):
        if (self.skip > 0) and (self.curval >= self.lastval):
            raise StopIteration()
        elif (self.skip < 0) and (self.curval <= self.lastval):
            raise StopIteration()
        else:
            oldval = self.curval
            self.curval += self.skip
            return oldval

for i in my_xrange(0, 10):
    print i
0 голосов
/ 24 декабря 2009

Вы неправильно используете эту языковую функцию.

http://docs.python.org/library/stdtypes.html#iterator-types

Эта ссылка выше объяснит, для чего должна использоваться функция.

Вы можете посмотреть документацию на своем родном языке здесь: http://wiki.python.org/moin/Languages

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...