有什么方法可以混合使用递归和yield语句吗?例如,无限数生成器(使用递归)将类似于:
yield
def infinity(start): yield start # recursion here ... >>> it = infinity(1) >>> next(it) 1 >>> next(it) 2
我试过了:
def infinity(start): yield start infinity(start + 1)
和
def infinity(start): yield start yield infinity(start + 1)
但是他们都没有做我想要的事情,第一个在屈服后停止start,第二个在屈服之后start,然后是发电机,然后停了下来。
start
注意: 请知道,您可以使用while循环来做到这一点:
def infinity(start): while True: yield start start += 1
我只想知道这是否可以递归进行。
是的,您可以这样做:
def infinity(start): yield start for x in infinity(start + 1): yield x
但是,一旦达到最大递归深度,这将出错。
从Python 3.3开始,您将可以使用
def infinity(start): yield start yield from infinity(start + 1)
如果您只是递归地调用生成器函数而不循环或生成yield from它,那么您要做的就是构建一个新的生成器,而无需实际运行函数主体或产生任何结果。
yield from
有关更多详细信息,请参见PEP 380。