我的推理的缺陷在哪里?根据我的理解,yield的工作方式类似于return语句,该语句返回生成器以继续迭代。我期望代码继续添加到列表中,但出现错误。
def method(self):
samplelist = []
while(condition):
#the data is collected
samplelist = data
yield samplelist
finalList += file.method()
编辑:我最初的错误是由于尝试使用+ =连接finalList时没有初始化值。这是通过使用finalList.append()解决的,但是,yield仍然无法正常工作,如果有人可以帮助我理解原因,我将非常感谢。
发布了一个相当有用的答案,然后由于某种原因将其删除。但是它解释说yield确实返回了一个生成器对象。由此,我尝试了一些不同的事情。
1他们还建议使用list(file.method())对其进行迭代。但是,这进一步将finalList的类型更改为元组,并且与我的其余代码不兼容。
2我试图遍历对象
for x in file_writer.write_records():
sample.append(x)
但结果相同。如何附加生成器对象的值?
我将忽略一个显而易见的事实,即file.method()
您的已发布代码中未声明该声明,因此无法如您所展示的那样调用它。因此,我将您的生成器功能称为method()
。如果您可以发布有效或至少一致的代码,这将很有用。
method()
返回一个生成器,而不是一个列表。你可以看到这个
>>> method()
<generator object f at 0x7f8b7a5bda50
您需要解决生成器。可以通过调用list()
它来完成:
finalList += list(method())
现在finalList
将结果method()
附加到它。请注意,这将多次调用生成器,直到condition
满足为止。生成新数据时,您的代码似乎挂起,但是这样做已经完成。您可以通过在yield之后添加打印语句来检查此情况,以查看控件已返回到生成器。
这对您将更有用:
for l in method():
finalList.extend(l)
# process finalList....
现在,在生成每个数据之后,控制权将返回到调用代码,并且调用代码有机会对其进行处理。
顺便说一句,您不需要samplelist = []
在循环中重新绑定它时进行初始化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句