@zlodiak

Как выглядят внутренности генератора?

Вот так выглядит итератор внутри:

#!/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__(). Помогите пожалуйста представить генератор в низкоуровневом виде(первый код, который я привёл я называю низкоуровневым. нужно что-то подобное).
  • Вопрос задан
  • 87 просмотров
Решения вопроса 1
longclaps
@longclaps
Всё просто - генератор не есть обычная функция, хранящая свои локальные данные в кадре общего стека. Он зачинает свой собственный отдельный стек, и все вызываемые им функции столуются в нём. Попросту это - отдельный поток, который оживает по обращению к генератору, выдаёт данные - и снова замирает.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы