为了账号安全,请及时绑定邮箱和手机立即绑定

Python 协程在产量上给出未知无

Python 协程在产量上给出未知无

长风秋雁 2022-09-06 10:22:00
我正在尝试根据用户输入构建一些数学运算的管道,并尝试打印该运算的累积结果。例如,输入将是一个操作列表,然后是数字输入的数量,然后是如下所示的数字:[square, accumulate]3123这应该返回如下内容:1514首先,它将 1 打印为 1*1,然后将该 1 与 2*2 给出 5 的结果相加,然后将其添加到 3*3 中,给出 14。但是我的方法有问题,第二个数字输入总是变成None值,我不知道为什么。我被困在得到:1None10有什么想法吗?这是我的代码:import mathimport osimport randomimport reimport sysdef printer():    while True:        x = yield        print(x)def co_generator(n):    for _ in range(n):        x = int(input())        yield xdef get_root():    while True:        number = (yield)        yield math.floor(math.sqrt(number))def get_square():    number = 0    while True:        number = (yield)        yield number**2def accumulator():    acum = 0    while True:        acum += (yield)        yield acumdef 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)
查看完整描述

3 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

您正在编写代码,就好像接收值并发送值一样。这不是它的工作方式。所有收益都发送一个值并接收一个值。(yield)yield whatever


当生成器执行时,它分两个阶段执行。首先,的参数成为当前或调用的返回值,生成器暂停执行。如果没有参数,则使用。这就是你的s来自哪里yieldyieldnextsendNoneNone


其次,当执行另一个 或 时,生成器将取消暂停,并且参数(或者如果使用)将成为表达式的值。nextsendsendNonenextyield


您正在尝试使用一个来接收参数,并使用另一个来设置 的返回值。你需要使用一个 single 来设置一个返回值并接收下一个 的参数。例如yieldsendsendyieldsendsend


def get_square():

    number = 0

    while True:

        number = yield number**2

或者,如果要使用单独的 s 在生成器端发送和接收值,则需要使用单独的(或)调用在另一端接收和发送值,并忽略 s。例如yieldsendnextNone


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()


查看完整回答
反对 回复 2022-09-06
?
慕森卡

TA贡献1806条经验 获得超8个赞

def rooter():

    number=0

    while True:

        number= yield math.floor(math.sqrt(number))

    


def squarer():

    number=0

    while True:

        number= yield number**2

产量将给没有尝试这种方式


def accumulator():

    number=0

    while True:

        number+= yield number 


查看完整回答
反对 回复 2022-09-06
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

我相信你需要在这里的代码中添加一个调用:nextoperations_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]


查看完整回答
反对 回复 2022-09-06
  • 3 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信