Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 产生多重价值_Python - Fatal编程技术网

Python 产生多重价值

Python 产生多重价值,python,Python,我们不能在python生成器函数中生成多个值吗 例如 In [677]: def gen(): .....: for i in range(5): .....: yield i, i+1 .....: In [680]: k1, k2 = gen() --------------------------------------------------------------------------- ValueError

我们不能在python生成器函数中生成多个值吗

例如

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()
返回的内容,而您没有做任何纠正。事实上,你似乎也有这种误解。事实上,你的第一句话是特别不正确的——generator
gen
是一个函数。@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