【问题标题】:How to return a generator from another function如何从另一个函数返回生成器
【发布时间】:2017-12-16 06:25:41
【问题描述】:

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

请注意,以下函数是用于说明目的的简单虚拟函数。请不要想出更好的方法来实现这些功能本身。

方法一
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)

并将其用作list(list(fun_b(10))[0]) 以获取[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

方法二
def fun_b(n):
    if n < 0: 
        yield None
        return
    for i in fun_a(n):
        yield i

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

虽然方法 1 看起来不错,但我不想返回列表列表,因为在其他情况下我会返回列表并且我不想弄乱我的代码。方法2只是效率低下。

什么是处理这种情况的真正好方法?

【问题讨论】:

    标签: python generator-expression


    【解决方案1】:

    如果你使用的是 Python 3.3 或更高版本,你可以使用 PEP 380 中引入的yield from 语法:

    PEP 380 添加了 yield from 表达式,允许生成器将其部分操作委托给另一个生成器。这允许将包含 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]
    >>> 
    

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

    【讨论】:

    • 我知道 Python 3 中的 yield from。我使用的是 python 2.7,但最好有一个确凿的答案。我觉得是时候切换到 python 3+ 了:)
    • @Unni 是的。我强烈建议你这样做。如果只是为了理智的 unicode 支持:P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-02
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多