Python 产生多重价值
我们不能在python生成器函数中生成多个值吗 例如Python 产生多重价值,python,Python,我们不能在python生成器函数中生成多个值吗 例如 In [677]: def gen(): .....: for i in range(5): .....: yield i, i+1 .....: In [680]: k1, k2 = gen() --------------------------------------------------------------------------- ValueError
In [677]: def gen():
.....: for i in range(5):
.....: yield i, i+1
.....:
In [680]: k1, k2 = gen()
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-680-b21f6543a7e9> in <module>()
----> 1 k1, k2 = a()
ValueError: too many values to unpack
即使我这样做,结果也是一样的:
In [692]: def a():
for i in range(5):
yield i
yield i+1
谢谢。因为gen()
返回一个生成器(一个项目-因此不能将其解包为两个),所以需要先对其进行升级才能获得值
g = gen()
a, b = next(g)
它与list
一起工作,因为这会隐式地消耗生成器
我们能再把它做成发电机吗?大概是这样的:
g = gen();
def yield_g():
yield g.next();
k1,k2 = yield_g();
因此,list(k1)
将给出[0,1,2,3,4]
,list(k2)
将给出[1,2,3,4,5]
保留现有的生成器,并使用izip
(或zip):
您的函数
gen
返回一个生成器,而不是从您给出的示例判断的值。如果在生成器上进行迭代,将生成成对的值:
In [2]: def gen():
...: for i in range(5):
...: yield i, i+1
...:
In [3]: for k1, k2 in gen():
...: print k1, k2
...:
0 1
1 2
2 3
3 4
4 5
使用来自
def gen():
对于范围(5)中的i:
(i,i+1)的收益率
[v代表gen()中的v]
# [0, 1, 1, 2, 2, 3, 3, 4, 4, 5]
他们说:
当使用yield from
时,它将提供的表达式视为子迭代器
不是这样。参见Jon Clements的回答。我的示例与此类似,它使用
for
-循环推进生成器。我同意乔恩的回答更为详尽,对问题有更好的解释。不过,我还是不明白我的答案是否被否决。我们能进一步把它做成发电机吗?类似这样的东西g=gen();def yield_g():yield g.next();k1,k2=屈服强度_g()因此,list(k1)
将给出[0,1,2,3,4]
和list(k2)
[1,2,3,4,5]
我对此投了否决票,因为它本质上是错误的。问题不是OP没有在列表中使用他的生成器。问题是,他误解了表达式gen()
返回的内容,而您没有做任何纠正。事实上,你似乎也有这种误解。事实上,你的第一句话是特别不正确的——generatorgen
是一个函数。@Marcin:我同意gen()是一个返回generator的函数(我的第一句话确实是错误的)。尽管如此,我认为重要的一点是,生成器通常是迭代的,并且
-循环的是在那里自然要做的事情。更新:在Python 3.x中,itertools.izip
已被内置的zip
所取代,因此最后一个代码块将变成k1,k2=zip(*gen)
。从给出的示例OP中,我不认为从中获得收益是他们所追求的,
from itertools import izip
k1, k2 = izip(*gen())
In [2]: def gen():
...: for i in range(5):
...: yield i, i+1
...:
In [3]: for k1, k2 in gen():
...: print k1, k2
...:
0 1
1 2
2 3
3 4
4 5