[英]Concatenate list with Yield
我的推理的缺陷在哪里? 根据我的理解,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 = []
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.