мой код выполняется неправильно
class a(object):
def __iter(self):
return 33
b={'a':'aaa','b':'bbb'}
c=a()
print b.itervalues()
print c.itervalues()
Попытайтесь использовать код, а не текст, потому что мой английский язык не очень хорош, спасибо
а. Напишите правильно: не
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 __
.
Если исправишь все три (!) ошибки, код работает лучше; -).
Вот пример кода, который реализует встроенную функцию 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
Вы неправильно используете эту языковую функцию.
http://docs.python.org/library/stdtypes.html#iterator-types
Эта ссылка выше объяснит, что функция должна использоваться для.
Вы можете попробовать просмотреть документацию на своем родном языке здесь: http://wiki.python.org/moin/Languages
Несколько слов о вашем коде:
__ iter
должно быть __ iter __
__ 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