gpt4 book ai didi

Python 协程在产量上给出未知的 None

转载 作者:行者123 更新时间:2023-12-02 19:38:07 25 4
gpt4 key购买 nike

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

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

最佳答案

您编写代码时就好像 (yield) 接收一个值并 yield 发送一个值。事情不是这样的。 所有yield都发送一个值并接收一个值。

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

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

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

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

或者,如果您想使用单独的 yield 在生成器端发送和接收值,那么您需要使用单独的 send (或 next ) 调用在另一端接收和发送值,并忽略 None。例如,

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

关于Python 协程在产量上给出未知的 None,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60748812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com