Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 7, 2019 22:38:45

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  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__(). Помогите пожалуйста представить генератор в низкоуровневом виде(первый код, который я привёл я называю низкоуровневым. нужно что-то подобное).

Офлайн

#2 Фев. 8, 2019 02:52:09

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version