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

Python中如何在生成器所有yield执行完毕后获取其return返回值

在Python中,生成器的return返回值不会被for循环、list()这类默认迭代方式直接返回,它会被封装在迭代结束时抛出的StopIteration异常的value属性中,你可以通过以下几种方式获取:


方法1:手动迭代捕获StopIteration异常

这是最通用的实现方式,兼容所有支持生成器的Python版本:

def gen_test():
    l = []
    for i in range(6):
        l.append(i)
        yield i
    return l

g = gen_test()
while True:
    try:
        current_yield_val = next(g)
        # 此处处理每次yield产出的值
        print(current_yield_val)
    except StopIteration as e:
        # 迭代完全部yield逻辑后,从异常中取return值
        gen_return_val = e.value
        break

print(gen_return_val) # 输出:[0, 1, 2, 3, 4, 5]

方法2:通过yield from获取(Python 3.3+ 支持)

如果你是在另一个生成器中调用目标生成器,使用yield from语法可以直接拿到目标生成器的return值:

def gen_test():
    l = []
    for i in range(6):
        l.append(i)
        yield i
    return l

def wrapper_gen():
    # yield from执行完后,会直接返回目标生成器的return值
    test_return = yield from gen_test()
    print(f"获取到gen_test的返回值:{test_return}")

# 正常迭代外层生成器即可
for val in wrapper_gen():
    print(val)

方法3:封装工具函数同时获取所有yield值和return值

如果你不想每次都手动写异常捕获逻辑,可以封装一个通用工具:

def get_gen_all_info(gen):
    yield_list = []
    while True:
        try:
            yield_list.append(next(gen))
        except StopIteration as e:
            return yield_list, e.value

all_yield_vals, return_val = get_gen_all_info(gen_test())
print(f"所有yield产出的值:{all_yield_vals}")
print(f"生成器return的值:{return_val}")

注意:直接使用list(gen_test())、for val in gen_test()这类内置迭代逻辑时,Python内部会自动捕获StopIteration异常,不会对外暴露return值,因此无法直接拿到返回结果。

内容的提问来源于stack exchange,提问作者Machkour Oke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:45:04