Что дает уступка? myVar = (выход)
Я знаком с доходностью, чтобы вернуть значение, главным образом, в этот вопрос
но что дает результат, когда он находится в правой части задания?
@coroutine
def protocol(target=None):
while True:
c = (yield)
def coroutine(func):
def start(*args,**kwargs):
cr = func(*args,**kwargs)
cr.next()
return cr
return start
Я наткнулся на это, на образцах кода этот блог, исследуя государственные машины и сопрограммы.
Ответы
Ответ 1
Оператор yield
, используемый в функции, превращает эту функцию в "генератор" (функцию, которая создает итератор). Получающийся итератор обычно возобновляется, вызывая next()
. Однако можно отправить значения функции, вызвав метод send()
вместо next()
, чтобы возобновить его:
cr.send(1)
В вашем примере это будет каждый раз присваивать значение 1
c
.
cr.next()
эффективно эквивалентно cr.send(None)
Ответ 2
Вы можете отправлять значения генератору с помощью функции send
.
Если вы выполните:
p = protocol()
p.next() # advance to the yield statement, otherwise I can't call send
p.send(5)
то yield
вернет 5, поэтому внутри генератора c
будет 5.
Кроме того, если вы вызываете p.next()
, yield
вернет None
.
Вы можете найти дополнительную информацию здесь.