我正在尝试根据用户输入构建一些数学运算的管道,并尝试打印此运算的累加结果。例如,输入将是一个操作列表,然后是数字输入的数量,然后是像这样的数字:
[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)
我相信您需要在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]
。
您正在编写代码,就像(yield)
收到一个值,yield whatever
发送一个值一样。那不是它的工作原理。 [所有yield
都发送一个值并接收一个。
[当生成器执行yield
时,它分两个阶段执行。首先,yield
的参数成为当前next
或send
调用的返回值,并且生成器暂停执行。如果没有参数,则使用None
。这就是您的None
来自的地方>
[其次,当执行另一个next
或send
时,生成器将取消挂起,并且send
参数(如果使用None
,则为next
)成为yield
表达式的值。
您正在尝试使用一个yield
来接收一个send
参数,而另一个用于设置send
的返回值。您需要使用单个yield
来设置send
返回值并接收下一个send
的参数。例如,
def get_square():
number = 0
while True:
number = yield number**2