【发布时间】:2018-05-21 13:22:17
【问题描述】:
我在玩yield,我编写了一个函数,它接受 3 个数字和一个限制,并以特定方式计算它们(计算并不重要,但可以在下面的代码中看到)。
values = []
def compute(limit, a, b, c):
if a <= limit:
print("Got {}, {}, {}".format(a, b, c))
values.append([a, b, c])
compute(limit, b*c, a*c, a*b)
else:
print("Process ended")
compute(9999, 2, 3, 4)
print(values)
这可行,并产生输出:
Got 2, 3, 4
Got 12, 8, 6
Got 48, 72, 96
Got 6912, 4608, 3456
Process ended
[[2, 3, 4], [12, 8, 6], [48, 72, 96], [6912, 4608, 3456]]
但是,我确信这可以通过使用 yield 来完成 - 主要是 values 列表创建部分,如您所见,它是由我在函数中手动填充的。
我之所以费心,就是为什么首先使用yield - 在这里没关系,但如果我的任务需要这个列表中的第 100000 个值怎么办 - 将它作为一个整体构建是考虑到我不想要以前的 99999 值,这不是必需的,甚至是愚蠢的......
我尝试使用类似的东西:
def compute_y(a, b, c):
while True:
yield b*c, a*c, b*a
for a, b, c in compute_y(2, 3, 4):
if a > 9999:
break
问题在于for 中的数字始终相同(2、3 和 4),因此它永远不会达到其他值,因此它是一个无限循环。
tl;dr - 我可以在这里使用 yield 来使算法更有效地处理更大的列表吗?
【问题讨论】:
标签: python python-3.x yield