Вы пишете свой код, как будто (yield)
получает значение, а yield whatever
отправляет его. Это не так, как это работает. Все yield
s отправляют значение и получают его.
Когда генератор выполняет yield
, он делает это в два этапа. Во-первых, аргумент yield
становится возвращаемым значением текущего вызова next
или send
, и генератор приостанавливает выполнение. Если аргумента нет, используется None
. Вот откуда приходят None
s
Секунда, когда выполняется другой next
или send
, генератор не работает, и аргумент send
(или None
, если next
был used) становится значением выражения yield
.
Вы пытаетесь использовать один yield
для получения аргумента send
, а другой для установки возвращаемого значения send
. Вам нужно использовать один yield
, чтобы установить send
возвращаемое значение и получить следующий аргумент send
. Например,
def get_square():
number = 0
while True:
number = yield number**2
В качестве альтернативы, если вы хотите использовать отдельные yield
s для отправки и получения значений на конце генератора, тогда вам нужно использовать отдельные send
(или next
) вызовы получать и отправлять значения на другом конце и игнорировать None
s. Например,
w.send(num)
num = next(w)
вместо num = w.send(num)
, поэтому operations_pipeline
будет выглядеть как
def operations_pipeline(numbers, operations, print_acum):
for num in numbers:
for w in operations:
w.send(num)
num = next(w)
print_acum.send(num)
for operation in operations:
operation.close()
print_acum.close()