2017-06-14 62 views
0

我的生成器(batch_generator)返回5個值,但我似乎無法弄清楚如何遍歷這些值。循環通過一個返回多個值的發生器

觀光我試着:

1)在for循環定義(ValueError: too many values to unpack (expected 5)

for a, b, c, d, e in next(batch_generator): 
    # do something with a-e 

2)就行內的解壓縮for循環(ValueError: too many values to unpack (expected 5)其中I解壓item直接解壓)

for item in next(batch_generator): 
    a, b, c, d, e = item 
    # do stuff 

3)郵編它和解壓在for循環定義(ValueError: not enough values to unpack (expected 5, got 1)

for a, b, c, d, e in zip(next(batch_generator)): 
    # do stuff 

4)ZIP並解壓內爲上,我解壓item線路迴路(ValueError: not enough values to unpack (expected 5, got 1),我認爲它只是包裹在另一元組現在)

for item in zip(next(batch_generator)): 
    a, b, c, d, e = item 

的到底發生了什麼對任何解釋與元組/發電機將不勝感激!

+0

但它發出5個項目,它不會發射五個元素的元組? –

+0

你可以顯示什麼批次發電機返回 – depperm

+0

我不知道你的意思 - 有沒有區別?我的收益聲明看起來像「收益a,b,c,d,e」。 – Jess

回答

4

我yield語句看起來像yield a, b, c, d, e

基礎上評論,發電機似乎發出的5元組的序列。

然後,您可以簡單地使用:

for a, b, c, d, e in batch_generator: 
    #    ^no next(..) 
    pass 

所以,你應該不使用next(..)。接下來只需返回下一個yield。現在,因爲這是一個元組,for循環將遍歷元組,而不是生成器。

for循環會遍歷元組發電機batch_generator發出,直到發電機耗盡(或有在for循環被激活的break/return聲明。

記住,for循環工作方式類似:

for <pattern> in <expression>: 
    # ... 

<expression>應該是一個迭代(發電機,元組,列表,...)和<pattern>用於分配,如果你遍歷元組,你這樣ITER。吃掉了那個元組的元素,而不是完整的元組。

+0

啊,我忽略了一個簡單的修復方法 - 非常感謝您的明確解釋! – Jess