2

我想做类似于以下的事情:

def normal(start):

    term = start
    while True:
        yield term
        term = term + 1


def iterate(start, inc):

    if inc == 1:
        return normal(start)
    else:
        term = start
        while True:
            yield term
            term = term + inc

现在这给出了以下错误。

SyntaxError: 'return' with argument inside generator

如何通过另一个函数将生成器返回到一个函数?(注意:此处显示的示例不需要这种功能,但它显示了我需要做的事情)

提前致谢。

4

2 回答 2

6

从 Python 3.3 开始,您可以yield from normal(start)按照PEP 380中的说明使用。在早期版本中,您必须手动迭代另一个生成器并生成它生成的内容:

if inc == 1:
    for item in normal(start):
        yield item

请注意,这不是“返回生成器”,而是一个生成器产生另一个生成器产生的值。您可以使用yield normal(start)来生成“正常”生成器对象本身,但从您的示例来看,这不是您想要的。

于 2013-09-09T04:10:02.153 回答
4

您不能在生成器表达式中返回。

在 Python 2.X 中,您必须手动链接生成器:

 def normal(start):

    term = start
    while True:
        yield term
        term = term + 1

 def iterate(start, inc):
    if inc == 1:
       for item in normal(start):
           yield item
    else:
        term = start
        while True:
            yield term
            term = term + inc

我假设您知道这两个示例都将永远运行:)

FWIW 在您的原始示例中,您可以通过制作两个生成器(例如“正常”和“异常”)然后从迭代函数返回一个或另一个来清理它。只要您不混合生成器和返回,您就可以返回生成器......可以这么说......

 #using original 'normal'

 def abnormal(start, inc):
    term = start
    while True:
        yield term
        term = term + inc

 def iterate (start, inc):
    if inc == 1: 
       return normal(start)
    return abnormal(start, inc)
于 2013-09-09T04:31:32.140 回答