2017-07-25 49 views
1

检索所有迭代器值比方说,我有这将产生两个值生成函数:从发生器功能

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将工作,但是,我更喜欢列表我的情况。

+0

x1和x2的所需类型是什么?名单?元组?只要它是可迭代的,什么都可以? – Kevin

+0

我宁愿列表。感谢您的评论,我更新了我的问题。 – Nyps

回答

5

如果x1x2可元组,它足以做

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

否则,你可以使用map申请list迭代器:

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

这样的代码是我非常喜欢python的原因... –

+0

谢谢各位各位的好评! – Nyps

3

你几乎已经:

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