Форум сайта python.su
0
terabaytИнтересный пример, но здесь у вас возвращается итератор уже встроенного класса list. Вы можете привести пример получения итератора через объект который не содержит __next__? - как у списков и словарей. Т.е. применив __iter__() к такому объекту который не содержит __next__, но его итератор уже будет с этим методом.)
и вот еще пример
Отредактировано taxik (Апрель 12, 2015 16:03:33)
Офлайн
103
taxik
но здесь у вас возвращается итератор уже встроенного класса list
taxikэмм.. что-то я не понял. list это список!
объекта который не содержит __next__? - как у списков
class C: def __init__(self, s): self.s = s def __iter__(self): print 'iter!!! ---' return iter(self.s) a = C('hello') print(dir(a)) print(dir(a.__iter__())) for c in a: print c
Офлайн
0
terabaytэто я понимаю.)
эмм.. что-то я не понял. list это список!
terabaytВаш класс C создает итератор для класса str, вы же в self.s передали строку. Получилась просто объертка.
вот пример
return iter([...])
Отредактировано taxik (Апрель 12, 2015 16:49:49)
Офлайн
103
taxikа почему бы и нет?!
вы же недумаете что там return iter()
py.user.nextiter, как я уже говорил, buil-in функция и я не вижу почему бы for или __iter__ не использовать его?
Он вызывает iter() для L и использует полученный объект для вызовов next().
Офлайн
0
terabaytТакого не может быть, потому что получится бесконечная рекурсия. - чтобы получить итератор нужно получить итератор от самого себя…
а почему бы и нет?!
Офлайн
47
может так будет понятней
>>> type([].__iter__()) <type 'listiterator'>
Офлайн
0
bismigalisСпасибо! я прозрел..))) Он просто возвращает объект другого класса который содержит __next__.
может так будет понятней
Офлайн
857
taxik
Спасибо, а вы можете дать ссылку где это указано(можно и на англ.)?
When using iterables, it is usually not necessary to call iter() or deal with iterator objects yourself. The for statement does that automatically for you, creating a temporary unnamed variable to hold the iterator for the duration of the loop.
>>> class A: ... def __iter__(self): ... print('In iter') ... self.it = iter('abc') ... return self ... def __next__(self): ... print('In next') ... return next(self.it) ... >>> a = A() >>> for i in a: ... print(i) ... In iter In next a In next b In next c In next >>>
>>> class A: ... pass ... >>> a = A() >>> iter(a) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'A' object is not iterable >>>
>>> class A: ... def __getitem__(self, v): ... return 'abc'[v] ... >>> a = A() >>> it = iter(a) >>> it <iterator object at 0xb7381e4c> >>> next(it) 'a' >>> next(it) 'b' >>> next(it) 'c' >>> next(it) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration >>> next(it) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration >>>
Отредактировано py.user.next (Апрель 13, 2015 00:06:01)
Офлайн