如何在python函数中访问双重收益?

alv*_*vas 2 python yield list generator

我有一个函数,产生一个列表的2个部分:

>>> x = [1,2,3,4,5,6]
>>> def fold(ls):
...     for i in range(0,2):
...             yield x[:i]
...             yield x[i:]
...
Run Code Online (Sandbox Code Playgroud)

我知道它仍然作为1生成器返回,尽管函数中有超过1个yield:

>>> fold(x)
<generator object fold at 0x13f9320>
>>> t1, t2 = fold(x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
Run Code Online (Sandbox Code Playgroud)

要访问它们,我可以:

>>> for i in fold(x):
...     print i
... 
[]
[1, 2, 3, 4, 5, 6]
[1]
[2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

我想对这两个执行不同的操作,所以我需要这样的访问:

>>> for i in fold(x):
...     t1, t2 = i
...     print t1, t2 # because 
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ValueError: need more than 0 values to unpack
Run Code Online (Sandbox Code Playgroud)

我可以在收益率的奇数/偶数上使用一些技巧并执行以下操作但是还有其他方法吗?

>>> for i,j in enumerate(fold(x)):
...     if i & 0x1:
...             print 't1', j
...     else:
...             print 't2', j
... 
t2 []
t1 [1, 2, 3, 4, 5, 6]
t2 [1]
t1 [2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

fre*_*ish 5

只是产生一个元组:

yield x[:i], x[i:]
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

for i in fold(x):
    t1, t2 = i
Run Code Online (Sandbox Code Playgroud)

甚至更好

for t1, t2 in fold(x):
    ...
Run Code Online (Sandbox Code Playgroud)

旁注:第一个ValueError来自于您尝试解压缩生成器的事实.无论发电机是什么,如果左侧的变量数量与发电机将产生的项目数量不同,您将始终得到此异常.这是巧合,但你所寻找的可能是这样的:

t1, t2 = list(fold(x))[0]
Run Code Online (Sandbox Code Playgroud)

  • 解包生成器,迭代器等没有任何问题."ValueError"是由于生成器包含4个项目. (2认同)