Вот так выглядит итератор внутри:
#!/usr/bin/env python3
class Obj():
def __init__(self, word):
self.word = word
def __iter__(self):
return Iterator(self.word)
class Iterator:
def __init__(self, word):
self.word = word
self.index = 0
def __next__(self):
try:
letter = self.word[self.index]
self.index += 1
return letter
except IndexError:
raise StopIteration()
def __iter__(self):
return self
obj = Obj('sergey')
it = iter(obj)
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))
Можно в итерируемом объекте итератор заменить генератором
так:
class Obj():
def __init__(self, word):
self.word = word
def __iter__(self):
for l in self.word:
yield l
obj = Obj('sergey')
it = iter(obj)
print(next(it))
print(next(it))
print(next(it))
print(next(it))
Получается, что генератор тоже реализует интерфейс итератора. То есть имеет методы __next__() и __iter__()
Проблема в том, что я не понимаю как генератор выглядит на низком уровне. Я вижу только:
for l in self.word:
yield l
и в этом куске кода нет метода __next__(). Помогите пожалуйста представить генератор в низкоуровневом виде(первый код, который я привёл я называю низкоуровневым. нужно что-то подобное).