我正在尝试编写一个生成器,并且发生了一些我不理解的事情:
我的代码片段:
def processTable(pathToTable, pages):
#some code here to open PyTable, get node etc
for i in pages:
try:
del aux10, aux11, aux20, aux21
except:
pass
aux10 = [row['value'] for row in tab.where('(done == 1) & (pageNr == i)')]
aux20 = [row['value'] for row in tab.where('(done == 2) & (pageNr == i)')]
aux11 = [row['value'] for row in tab.where('(done == 3) & (pageNr == i)')]
aux21 = [row['value'] for row in tab.where('(done == 4) & (pageNr == i)')]
yield (i, np.array(aux10).mean(), np.array(aux10).std()), (i, np.array(aux11).mean(), np.array(aux11).std()), (i, np.array(aux20).mean(), np.array(aux20).std()), (i, np.array(aux21).mean(), np.array(aux21).std())
预期的输出
预期的输出将是4个值,例如:
a = ((element10_i, its_mean, its_std), (element_i+1, its_mean, its_std), ...)
b = ((element11_i, its_mean, its_std), (element_i+1, its_mean, its_std), ...)
c = ((element20_i, its_mean, its_std), (element_i+1, its_mean, its_std), ...)
d = ((element21_i, its_mean, its_std), (element_i+1, its_mean, its_std), ...)
这样就行了。我确实是这样的:
>>import generatorTables as pro
>>from itertools import izip
>>testPages = [1,2,3,4,5,6,7,8]
>>gen = pro.processTable(pathToPyTable, testPages)
>>a,b,c,d = izip(*gen)
输出值
>>a
((1, 9.034405600010885, 0.32797176526389787), (2, 9.0305521432119082, 0.33138509286206153), (3, 8.9994696778116783, 0.31336561331661922), (4, 9.0586203572673725, 0.31509917770176399), (5, 9.1253471514046396, 0.32446032765733307), (6, 8.9412112513166786, 0.31844521244534058), (7, 8.9666645705587129, 0.33561146807260173), (8, 8.797215574852185, 0.32094724030435973))
因此,到目前为止,一切正常。
问题是,如果出于某种原因我想重复计算(例如测量时间),则会得到以下信息:
>>> del a,b,c,d
>>> a,b,c,d = izip(*gen)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: need more than 0 values to unpack
因此,我不介意:
为什么它以前而不是现在起作用
为什么说“需要超过0个值才能解包”?我以为我做的很好。
注意:
如果有人想提出任何其他方法来产生这四个值,那将是非常受欢迎的。
最佳答案
生成器的全部要点是它仅生成一次值,并且不将这些值保存在内存中。
如果要重用这些值,则必须再次调用原始函数来创建新的生成器,或者使用list
代替生成器。
要创建新的生成器,只需重复以下两个语句:
>>gen = pro.processTable(pathToPyTable, testPages)
>>a,b,c,d = izip(*gen)
如果要使用列表而不修改生成器代码,则可以使用列表推导来捕获生成器的输出。
gen = [x for x in pro.processTable(pathToPyTable, testPages)]
关于python - 屈服具有罕见的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24114617/