Я не могу понять метод send
. Я понимаю, что он используется для работы генератора. Но
синтаксис здесь: generator.send(value)
.
Я почему-то не могу понять, почему значение должно стать результатом текущего выражения yield
. Я подготовил пример:
def gen():
for i in range(10):
X = yield i
if X == 'stop':
break
print("Inside the function " + str(X))
m = gen()
print("1 Outside the function " + str(next(m)) + '\n')
print("2 Outside the function " + str(next(m)) + '\n')
print("3 Outside the function " + str(next(m)) + '\n')
print("4 Outside the function " + str(next(m)) + '\n')
print('\n')
print("Outside the function " + str(m.send(None)) + '\n') # Start generator
print("Outside the function " + str(m.send(77)) + '\n')
print("Outside the function " + str(m.send(88)) + '\n')
#print("Outside the function " + str(m.send('stop')) + '\n')
print("Outside the function " + str(m.send(99)) + '\n')
print("Outside the function " + str(m.send(None)) + '\n')
Результат:
1 Outside the function 0
Inside the function None
2 Outside the function 1
Inside the function None
3 Outside the function 2
Inside the function None
4 Outside the function 3
Inside the function None
Outside the function 4
Inside the function 77
Outside the function 5
Inside the function 88
Outside the function 6
Inside the function 99
Outside the function 7
Inside the function None
Outside the function 8
Ну, честно говоря, меня это удивило.
- В документации мы можем прочитать, что при выполнении оператора
yield
состояние генератора замораживается, а значениеexpression_list
возвращается вызывающему абонентуnext
. Ну, похоже, это не случилось. Почему мы можем выполнить инструкциюif
иprint
внутриgen()
. - Как я могу понять, почему
X
внутри и снаружи функции отличается? ОК. Предположим, чтоsend(77)
передает 77 вm
. Ну, выражениеyield
становится 77. Тогда что такоеX = yield i
? И как 77 внутри функции преобразуется в 5, когда происходит снаружи? - Почему первая строка результата не отражает ничего, что происходит внутри генератора?
В любом случае, не могли бы вы как-нибудь прокомментировать эти инструкции send
и yield
?