用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)
但结果还是一样。我该如何从生成器对象中添加值呢?
1 个回答
我会忽略一些明显的问题,比如你发的代码里没有声明 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 = []
,因为你在循环中会重新绑定它。