生成器中使用递归是否有特殊行为?为何递归生成器仅输出4?
递归生成器为何只输出4?
先看你给出的普通递归函数:
def generator_recursion(n): if n < 0: return else: generator_recursion(n-1) print(n) generator_recursion(4)
这段代码里,调用generator_recursion(n-1)会直接执行函数逻辑——递归到n=-1返回后,会从n=0开始依次执行print(n),所以能输出0、1、2、3、4。
但生成器版本的问题出在生成器的核心特性上:调用生成器函数不会立即执行函数体,只会返回一个生成器迭代器对象。你的生成器代码:
def generator_recursion(n): if n < 0: return else: generator_recursion(n-1) # 仅创建生成器对象,未迭代激活 yield n gr = generator_recursion(4) for k in gr: print(k)
当你调用generator_recursion(n-1)时,只是创建了对应n值的生成器对象,但没有对这个对象做迭代操作,它内部的递归逻辑和yield语句都不会触发。只有当你迭代最外层的gr(对应n=4的生成器)时,才会执行到yield n,输出4;而递归过程中创建的n=3、2、1、0的生成器都没被激活,自然不会产生任何输出。
要让递归生成器正常产出所有值,需要迭代递归返回的子生成器,推荐用yield from语法:
def generator_recursion(n): if n < 0: return else: yield from generator_recursion(n-1) # 迭代子生成器,传递所有产出值 yield n gr = generator_recursion(4) for k in gr: print(k)
这段代码会输出0、1、2、3、4。yield from的作用是把子生成器的所有产出值直接传递给当前生成器的调用者,等价于手动循环子生成器并逐个yield:
def generator_recursion(n): if n < 0: return else: for num in generator_recursion(n-1): yield num yield n
内容的提问来源于stack exchange,提问作者FerntreeGuy
相关产品推荐
相关产品推荐

