我想做类似以下的事情:
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
如何通过另一个函数将生成器返回到一个函数? (注意:此处显示的示例不需要此类功能,但它显示了我需要执行的操作)
提前致谢。
答案 0 :(得分:6)
从Python 3.3开始,您可以使用PEP 380中所述的yield from normal(start)
。在早期版本中,您必须手动迭代另一个生成器并产生它产生的内容:
if inc == 1:
for item in normal(start):
yield item
请注意,这不是“返回发电机”,它是一个发电机,产生另一个发电机产生的值。您可以使用yield normal(start)
来生成“普通”生成器对象本身,但从您的示例来看,这不是您正在寻找的。 p>
答案 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)