如何从另一个函数返回一个生成器

Unn*_*nni 5 python generator-expression

我有一个生成器函数,我想从另一个函数调用并返回获得的生成器.我可以在这看到两种方法 -

注意,下面的函数是简单的虚函数来说明目的.请不要提出更好的方法来实现这些功能.

方法1
def fun_a(n):
    for i in range(n):
        yield i+10

def fun_b(n):
    if n < 0: 
        yield None
        return
    yield fun_a(n)
Run Code Online (Sandbox Code Playgroud)

并用它list(list(fun_b(10))[0])来获取[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

方法2
def fun_b(n):
    if n < 0: 
        yield None
        return
    for i in fun_a(n):
        yield i
Run Code Online (Sandbox Code Playgroud)

然后list(fun_b(10))可以给我[10, 11, 12, 13, 14, 15, 16, 17, 18, 19].

虽然方法1似乎很好,但我不想返回列表列表,因为在其他情况下我返回一个列表而我不想搞砸我的代码.方法2效率低下.

处理这种情况的最佳方法是什么?

Chr*_*ean 12

我使用的是Python 3.3或更高版本,您可以使用yield fromPEP 380中引入的语法:

PEP 380从表达式中添加了yield,允许生成器将其部分操作委托给另一个生成器.这允许将包含yield的一段代码分解出来并放在另一个生成器中.此外,允许子生成器返回一个值,并使该值可用于委派生成器.

>>> def fun_a(n):
    for i in range(n):
        yield i+10

>>> def fun_b(n):
    if n < 0: 
        yield None
        return
    yield from fun_a(n)


>>> list(fun_b(10))
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> 
Run Code Online (Sandbox Code Playgroud)

如果没有,那么你只需要使用for item in iterable:语法.