Форум сайта python.su
0
# Python 3
Cоздадим список "L", который явл. итерируемым объектом но не итератором, мы не можем к нему применить next(L) или L.__next__()
L = [1,2,3,4,5]
I = iter(L)
Отредактировано taxik (Апрель 12, 2015 14:46:30)
Офлайн
857
taxikОн вызывает iter() для L и использует полученный объект для вызовов next().
Вопрос - что он(Python) делает когдя я передаю в for "L“? Он автоматически создает итератор для него, или же он использует что то другое?
Офлайн
0
py.user.nextСпасибо, а вы можете дать ссылку где это указано(можно и на англ.)?
L[0], L[1]...
Отредактировано taxik (Апрель 12, 2015 14:55:54)
Офлайн
103
не знаю где это указано, но можно на примере увидеть что for автоматически вызывает iter
class C: def __init__(self, stop): self.current = 0 self.stop = stop def __iter__(self): print 'iter!!! ---' return self def next(self): if self.current > self.stop: raise StopIteration else: self.current += 1 return self.current - 1 for c in C(8): print c
class C: def __init__(self, stop): self.current = 0 self.stop = stop def __iter__(self): print('iter!!! ---') return self def __next__(self): if self.current > self.stop: raise StopIteration else: self.current += 1 return self.current - 1 for c in C(8): print(c)
Отредактировано terabayt (Апрель 12, 2015 15:01:12)
Офлайн
0
terabaytСогласен, но у вас С сразу поддерживает __next__(). А список или словарь нет.
python 3
Отредактировано taxik (Апрель 12, 2015 15:10:05)
Офлайн
103
taxikда ну
А список или словарь нет.
>>> dir(list) ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'] >>> dir(dict) ['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
Отредактировано terabayt (Апрель 12, 2015 15:10:32)
Офлайн
0
terabaytи где вы там __next__ нашли?.)
та ну
Офлайн
103
taxikну если имеется __iter__, то соответственно
и где вы там __next__ нашли?.)
>>> dir([].__iter__()) ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__'] >>> dir({}.__iter__()) ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
Офлайн
0
terabaytПолучается изначально он не содержит __next__, а полсе вызова __iter__ он добавляет ему метод __next__. Интересно что, если из вашего класса "C" удалить __next__ и вызвать к нему __iter__ он не добавит ему __next__, видимо это работает только для встроенных классов(или такой класс должен содержать доп. методы или атрибуты).
ну если имеется __iter__, то соответственно
Отредактировано taxik (Апрель 12, 2015 15:24:47)
Офлайн
103
taxikне совсем
Получается изначально он не содержит __next__, а полсе вызова __iter__ он добавляет ему метод __next__
>>> a = [1,2] >>> dir(a) ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'] >>> a.__iter__() <list_iterator object at 0x7fdcac999390> >>> dir(a) ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
taxikто будет ошибка
при передаче в for если Python не находит у него __next__() то он вызывает к этому объекту iter()
class C: def __init__(self, stop): self.current = 0 self.stop = stop def __iter__(self): print('iter!!! ---') return self for c in C(8): print(c)
iter!!! --- Traceback (most recent call last): File "hello.py", line 10, in <module> for c in C(8): TypeError: iter() returned non-iterator of type 'C'
class C: def __init__(self, stop): self.current = 0 self.stop = stop def __iter__(self): print('iter!!! ---') return iter([1]*self.stop) for c in C(8): print(c)
Офлайн