я не знаю __ проход __ в Python, кто может дать мне хороший пример кода

мой код выполняется неправильно

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

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

6
задан SilentGhost 25 December 2009 в 10:43
поделиться

4 ответа

а. Напишите правильно: не

   def __iter(self):

, а:

   def __iter__(self):

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

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

return 33

, а:

yield 33

или return iter ([33])

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

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

a().itervalues()

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

for x in a(): print x

или

print list(a())

itervalues ​​ - это метод dict, не имеющий ничего общего с __ iter __ .

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

17
ответ дан 8 December 2019 в 05:21
поделиться

Вот пример кода, который реализует встроенную функцию 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
1
ответ дан 8 December 2019 в 05:21
поделиться

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

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

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

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

0
ответ дан 8 December 2019 в 05:21
поделиться

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

  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

5
ответ дан 8 December 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: