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

Python含条件yield的函数返回异常问题:原因及修正方案

生成器中return range(5)为何返回空列表?如何修复?

先看你的代码和运行结果:

原生成器代码:

def foo(arg):
    if arg:
        yield -1
    else:
        return range(5)

运行结果:

>>> list(range(5))
[0, 1, 2, 3, 4]
>>> list(foo(True))
[-1]
>>> list(foo(False))
[]

问题原因

在Python的生成器函数里,return语句的作用和普通函数完全不同:它不会把返回值传递给迭代器的消费者(比如list()),而是会直接触发StopIteration异常,终止迭代。虽然return后面的内容会被赋值给StopIteration的value属性,但list()这类工具在迭代生成器时,只会捕获StopIteration来停止迭代,不会去读取这个value,所以最终得到空列表。

修复方法

如果想让生成器迭代range(5)里的所有元素,不能用return,而是要用yield from语法,它会把可迭代对象(比如range)里的每个元素逐个yield出来:

修改后的代码:

def foo(arg):
    if arg:
        yield -1
    else:
        yield from range(5)

测试结果:

>>> list(foo(False))
[0, 1, 2, 3, 4]
>>> list(foo(True))
[-1]

这样就符合你的预期了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:39:53