что делает yield как присваивание? myVar = (выход) - PullRequest
30 голосов
/ 07 января 2010

Я знаком с yield для возврата значения, в основном благодаря этому вопросу

но что делает yield, когда он находится справа от задания?

@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

Я сталкивался с этим на примерах кода этого блога , исследуя конечные автоматы и сопрограммы.

Ответы [ 2 ]

36 голосов
/ 07 января 2010

Оператор yield, используемый в функции, превращает эту функцию в «генератор» (функцию, которая создает итератор). Получающийся итератор обычно возобновляется вызовом next(). Однако можно отправить значения в функцию, вызвав метод send() вместо next() для его возобновления:

cr.send(1)

В вашем примере это присвоит значение 1 c каждый раз.

cr.next() фактически эквивалентно cr.send(None)

11 голосов
/ 07 января 2010

Вы можете отправлять значения в генератор, используя функцию 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.

Вы можете найти больше информации здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...