gpt4 book ai didi

python - Python 2 中的“yield from”替代品

转载 作者:太空宇宙 更新时间:2023-11-04 09:52:12 25 4
gpt4 key购买 nike

我的代码使用 yield frompython3 中,在 递归调用 中,它工作得很好。现在的问题是,这是 PEP-380 引入的在 python 3.3我需要它在 python 2.7 中工作.我阅读了几篇文章,但都不够详细或不够简单。

很少有引用文章:

和其他一些。

我重新创建了一个小示例代码(接受一个多级列表并返回一个扁平化列表)非常简约与我的要求相比。

#python 3
def foo(obj):
for ele in obj:
if isinstance(ele, list):
yield from foo(ele)
else:
yield ele

#驱动程序值:

>>> l = [1, [2, 3, [4,5]]]
>>> list(foo(l))
=> [1, 2, 3, 4, 5]

相同的转换在 python 2.7 中不起作用,因为 yield from 不可用。

最佳答案

仍然需要循环。你在这里递归并不重要。

您需要遍历递归调用产生的生成器并产生结果:

def foo(obj):
for ele in obj:
if isinstance(ele, list):
for res in foo(ele):
yield res
else:
yield ele

您的递归调用会产生一个生成器,您需要继续传递生成器的结果。为此,您可以遍历生成器并生成各个值。

没有更好的选择,除了升级到 Python 3。

yield from 本质上将循环的责任传递给调用者,并将任何 generator.send()generator.throw() 调用委托(delegate)生成器。您不需要传递 .send().throw(),所以剩下的就是自己负责循环。

演示:

>>> import sys
>>> sys.version_info
sys.version_info(major=2, minor=7, micro=14, releaselevel='final', serial=0)
>>> def foo(obj):
... for ele in obj:
... if isinstance(ele, list):
... for res in foo(ele):
... yield res
... else:
... yield ele
...
>>> l = [1, [2, 3, [4,5]]]
>>> list(foo(l))
[1, 2, 3, 4, 5]

yield fromPEP 380 -- Syntax for Delegating to a Subgenerator 中引入(不是 PEP 342),特别是因为子生成器上的循环不会委托(delegate) generator.throw()generator.send() 信息。

PEP 明确指出:

If yielding of values is the only concern, this can be performed without much difficulty using a loop such as

for v in g:
yield v

Formal Semantics有一个 Python 实现等价物,起初看起来可能令人生畏,但您仍然可以看出它是循环(使用 while 1:,当出现异常或 StopIteration 被处理,使用 next()generator.send(..) 检索新值,并产生结果(使用 yield _y).

关于python - Python 2 中的“yield from”替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47329423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com