Форум сайта python.su
0
Извиняюсь за дикий вопрос, но мне кажется, что я не понимаю какую-то фундаментальную вещь.
Вот так выглядит итератор внутри:
#!/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 += 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__(). Помогите пожалуйста представить генератор в низкоуровневом виде(первый код, который я привёл я называю низкоуровневым. нужно что-то подобное).
Офлайн
857
Вот тут все определения
https://docs.python.org/3/glossary.html#term-iterable
https://docs.python.org/3/glossary.html#term-iterator
https://docs.python.org/3/glossary.html#term-generator
https://docs.python.org/3/glossary.html#term-generator-iterator
https://docs.python.org/3/glossary.html#term-sequence
https://docs.python.org/3/glossary.html#term-generator-expression
tags: iterator
Отредактировано py.user.next (Фев. 8, 2019 02:53:54)
Офлайн