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
相关产品推荐
相关产品推荐

