You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 04:05:19