使用Yield连接列表

时间:2014-06-25 13:50:36

标签: python list concatenation yield

我推理的缺陷在哪里?从我的理解产量类似于返回到生成器继续迭代的返回语句。我期待代码继续添加到列表中但我收到错误。

def method(self):
    samplelist = []
    while(condition):
         #the data is collected
         samplelist = data
         yield samplelist

finalList += file.method()

编辑: 我的初始错误是由于尝试使用+ =连接finalList,因为它没有初始值。这是通过使用finalList.append()来解决的,但是,产量仍然无法正常工作,如果有人能帮助我理解原因,我将非常感激。

发布了一个相当有用的答案,然后由于某种原因删除了。但它解释说,收益率确实是一个发电机对象。从这开始我尝试了一些不同的东西。

1他们还建议使用list(file.method())来迭代它。然而,这进一步将finalList的类型更改为元组,并且与我的其余代码不兼容。

2我试图迭代对象做

for x in file_writer.write_records():
    sample.append(x)

但结果相同。如何附加生成器对象的值?

1 个答案:

答案 0 :(得分:1)

我将忽略显而易见的事实,即file.method()未在您发布的代码中声明,因此无法在您显示时调用。所以我将你的生成器函数称为method()。如果您可以发布有效或至少一致的代码,那将非常有用。

method()返回生成器,而不是列表。你可以通过

看到这个
>>> method()
<generator object f at 0x7f8b7a5bda50

您需要解析生成器。这可以通过调用list()来完成:

finalList += list(method())

现在finalList会附加method()的结果。请注意,这将多次调用生成器,直到满足condition。生成新数据时,您的代码似乎会挂起,但这样做完成了。您可以通过在yield之后添加print语句来检查这一点,以查看返回到生成器的控件。

这对您更有用:

for l in method():
    finalList.extend(l)
    # process finalList....

现在,在生成每个数据后,控制权将返回到调用代码,并且调用代码有机会对其进行处理。

顺便说一句,在循环中重新绑定它时,不需要初始化samplelist = []