在python中返回生成器

时间:2013-09-09 04:06:39

标签: python

我想做类似以下的事情:

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

如何通过另一个函数将生成器返回到一个函数? (注意:此处显示的示例不需要此类功能,但它显示了我需要执行的操作)

提前致谢。

2 个答案:

答案 0 :(得分:6)

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

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

请注意,这不是“返回发电机”,它是一个发电机,产生另一个发电机产生的值。您可以使用yield normal(start)来生成“普通”生成器对象本身,但从您的示例来看,这不是您正在寻找的。

答案 1 :(得分: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

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

在您的原始示例中,您可以通过创建两个生成器(例如,“mormal”和“abnormal”)然后从迭代函数返回一个或另一个来清理它。只要你没有混合发电机和回报,你就可以返回发电机......可以这么说......

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