从生成器函数中检索所有迭代器值

时间:2017-07-25 13:00:34

标签: python iterator generator

假设我有一个生成函数,它产生两个值:

def gen_func():
    for i in range(5):
        yield i, i**2

我想检索函数的所有迭代器值。目前,我将此代码段用于此目的:

x1, x2 = [], []
for a, b in gen_func():
    x1.append(a)
    x2.append(b)

这适合我,但看起来有点笨重。是否有更紧凑的编码方式?我想的是:

x1, x2 = map(list, zip(*(a, b for a, b in gen_func())))

然而,这只是给我一个语法错误。

PS:我知道我可能不应该为此目的使用发电机,但我需要在其他地方使用。

修改x1x2的任何类型都可以使用,不过,我更喜欢列表。

2 个答案:

答案 0 :(得分:5)

如果x1x2可以是元组,那就足够了

>>> x1, x2 = zip(*gen_func())
>>> x1
(0, 1, 2, 3, 4)
>>> x2
(0, 1, 4, 9, 16)

否则,您可以使用maplist应用于迭代器:

x1, x2 = map(list, zip(*gen_func()))

只是为了好玩,使用扩展的可迭代解包可以做同样的事情:

>>> (*x1,), (*x2,) = zip(*gen_func())
>>> x1
[0, 1, 2, 3, 4]
>>> x2
[0, 1, 4, 9, 16]

答案 1 :(得分:3)

你几乎拥有它:

x1, x2 = map(list, zip(*gen_func()))