python - 如何在 python 函数中访问 double yield?

标签 python list generator yield

我有一个函数可以生成列表的两个部分:

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

我知道它仍然作为 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

要访问它们,我可以:

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

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

>>> 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

我可以对 yield 的奇数/偶数使用一些技巧并执行以下操作,但还有其他方法吗?

>>> 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]

最佳答案

只产生一个元组:

yield x[:i], x[i:]

然后你可以这样做:

for i in fold(x):
    t1, t2 = i

甚至更好

for t1, t2 in fold(x):
    ...

旁注:第一个ValueError 是因为您正在尝试解压生成器。无论生成器是什么,如果左侧的变量数与生成器将产生的项目数不同,您将始终得到此异常。这是一个巧合,但您正在寻找的可能是这样的:

t1, t2 = list(fold(x))[0]

关于python - 如何在 python 函数中访问 double yield?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21258746/

相关文章:

python - 我怎样才能从我的情节中删除一条额外的线?

python - 我正在做很多列表和字典排序......这导致 Python 网站出现内存错误

c# - 创建动态对象

python - 如何递归地将项目添加到列表中?

python - 过滤掉生成器

c - 为什么我仍然收到这些错误?

python - Pandas read_csv 到多个 DataFrame 中

python - 当我执行 pip --version 时,它显示错误为 ImportError : No module named pyparsing

python - 从命令提示符运行时程序抛出(文件中以 '\xff' 开头的非 UTF-8 代码)

javascript - 如何从yield *返回