繁体   English   中英

将列表与产量合并

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM