递归生成器(recursive generator)无法工作:嵌套元组展平异常
解决递归生成器展平嵌套元组的问题
我来帮你搞定这个问题!你遇到的核心问题是递归调用生成器时没有正确传递产出值——直接调用生成器函数不会自动把它的结果“平铺”到当前生成器里,导致嵌套层的元素根本没被处理,只输出了最外层的非元组元素。
先看看你可能写错的代码(典型错误)
比如下面这段代码就会出现你说的问题:
def flatten(nested): for item in nested: if isinstance(item, tuple): flatten(item) # 这里只调用了生成器,但没把它的结果yield出来! else: yield item # 测试 print(tuple(flatten((('a', 'b'), 'c')))) # 输出 ('c',)
当代码遇到嵌套元组('a','b')时,只是调用了flatten(item),但这个生成器的产出值完全被忽略了,没有传递到上层生成器里,所以只有最外层的'c'被yield出来。
修正后的正确代码
只需要把递归调用的地方改成yield from,就能让递归生成器的结果被平铺到当前生成器中:
def flatten(nested): for item in nested: if isinstance(item, tuple): yield from flatten(item) # 用yield from迭代递归生成器的所有产出 else: yield item # 测试验证 result = tuple(flatten((('a', 'b'), 'c'))) print(result) # 输出 ('a', 'b', 'c')
如果你用的是Python 3.3之前的版本(没有yield from)
可以手动遍历递归生成器的结果,效果和yield from一样:
def flatten(nested): for item in nested: if isinstance(item, tuple): # 手动遍历递归生成器,逐个yield元素 for sub_item in flatten(item): yield sub_item else: yield item
关键总结
递归生成器处理嵌套结构时,必须把递归调用的结果迭代并产出——yield from就是干这个的语法糖,它会自动帮你遍历递归返回的生成器,把每个元素都传递到上层。如果直接调用生成器而不处理它的产出,嵌套层的元素就会被彻底忽略,自然只输出最外层的非嵌套内容啦。
内容的提问来源于stack exchange,提问作者Jordan Valansi
相关产品推荐
相关产品推荐

