Python协程在产量上没有未知值

问题描述 投票:1回答:2

我正在尝试根据用户输入构建一些数学运算的管道,并尝试打印此运算的累加结果。例如,输入将是一个操作列表,然后是数字输入的数量,然后是像这样的数字:

[square, accumulate]
3
1
2
3

这应该返回类似:

1
5
14

[首先将1打印为1 * 1,然后将1加到2 * 2的结果中得到5,然后将其加到3 * 3的结果中得到14。但是我的方法有问题,第二个数字输入总是变成None值,我不知道为什么。我被困住了:

1
None
10

有什么想法吗?这是我的代码:

import math
import os
import random
import re
import sys

def printer():
    while True:
        x = yield
        print(x)

def co_generator(n):
    for _ in range(n):
        x = int(input())
        yield x

def get_root():
    while True:
        number = (yield)
        yield math.floor(math.sqrt(number))

def get_square():
    number = 0
    while True:
        number = (yield)
        yield number**2

def accumulator():
    acum = 0
    while True:
        acum += (yield)
        yield acum

def operations_pipeline(numbers, operations, print_acum):
    for num in numbers:
        for i, w in enumerate(operations):
            num = w.send(num)
        print_acum.send(num)
    for operation in operations:
        operation.close()
    print_acum.close()

if __name__ == '__main__':
    order = input().strip()
    n = int(input())

    numbers = co_generator(n)

    print_acum = printer()
    next(print_acum)

    root = get_root()
    next(root)

    accumulate = accumulator()
    next(accumulate)

    square = get_square()
    next(square)

    operations_pipeline(numbers, eval(order), print_acum)
python yield coroutine
2个回答
0
投票

我相信您需要在next代码中添加对operations_pipeline的呼叫:

def operations_pipeline(numbers, operations, print_acum):
    for num in numbers:
        for i, w in enumerate(operations):
            num = w.send(num)
            next(w) # <<<--- this

[假设我的第一个输入是get_square,那么我不相信它会第二次回到[square, accumulate]


0
投票

您正在编写代码,就像(yield)收到一个值,yield whatever发送一个值一样。那不是它的工作原理。 [所有yield都发送一个值并接收一个。

[当生成器执行yield时,它分两个阶段执行。首先,yield的参数成为当前nextsend调用的返回值,并且生成器暂停执行。如果没有参数,则使用None。这就是您的None来自的地方>

[其次,当执行另一个nextsend时,生成器将取消挂起,并且send参数(如果使用None,则为next)成为yield表达式的值。

您正在尝试使用一个yield来接收一个send参数,而另一个用于设置send的返回值。您需要使用单个yield来设置send返回值并接收下一个send的参数。例如,

def get_square():
    number = 0
    while True:
        number = yield number**2
© www.soinside.com 2019 - 2024. All rights reserved.