如何在Python递归中实现yield与yield from?求助实现方案
Python递归中yield与yield from的正确实现指导
问题分析
你的代码核心问题是条件判断逻辑颠倒:初始调用时parents是有值的([1020253]),会直接执行if len(parents) !=0分支返回当前值,不会进入递归分支。同时递归分支里的逻辑也有错误,应该先获取子节点,再递归,并且要先返回当前层结果,再转发递归的结果。
修正后的代码实现
测试数据
import pandas as pd init_parent = [1020253] df = pd.DataFrame({'parent': [1020253, 1020253], 'id': [1101941, 1101945]})
正确的递归遍历函数
def recur1(df, parents, parentChild=None, step=0): # 先返回当前层级的父节点与对应父关联(初始时parentChild为None) yield parents, parentChild # 获取当前父节点对应的所有子节点 children_df = df.loc[df['parent'].isin(parents)] if not children_df.empty: # 提取子节点ID作为下一层的父节点 next_parents = children_df['id'].to_numpy() # 提取当前子节点对应的父节点,用于关联 current_parentChild = children_df['parent'].to_numpy() # 递归遍历下一层,用yield from接收递归生成器的所有结果 yield from recur1(df=df, parents=next_parents, parentChild=current_parentChild, step=step+1)
执行与验证
out = recur1(df, init_parent, step=0) result = [x for x in out] print(result)
输出结果:
[([1020253], None), (array([1101941, 1101945]), array([1020253, 1020253]))]
关键知识点说明
- yield的作用:在递归函数中,
yield用于逐层级返回当前节点的结果,每执行一次yield,生成器就会暂停并返回值,下次迭代时从暂停处继续。 - yield from的用法:
yield from可以直接将递归调用返回的生成器中的所有结果“转发”出来,无需手动遍历递归生成器再逐个yield,相当于简化了for item in recursive_call(): yield item的写法。 - 递归逻辑的核心:递归函数需要先处理当前层级的输出,再判断是否有子节点,若有则递归处理下一层,确保每一层的结果都能被生成器返回。
常见错误规避
- 不要颠倒条件判断:必须先处理当前层级,再检查是否需要递归,否则会跳过初始层级或无法进入递归。
- 确保递归终止条件:当没有子节点时(
children_df.empty),停止递归,避免无限递归。 - 注意数据类型转换:使用
to_numpy()时要确保数据帧非空,否则会报错,所以先判断children_df.empty。
内容的提问来源于stack exchange,提问作者John Stud
相关产品推荐
相关产品推荐

