首页 新闻 会员 周边 捐助

以下关于Python生成器的描述,哪一项是错误的?

0
[已关闭问题] 关闭于 2025-12-02 11:00
A
生成器函数执行时返回生成器对象,函数体不会立即执行
B
生成器对象可通过next()或for循环获取值
C
yield语句会暂停函数执行并保留状态,下次调用时恢复
D
生成器函数中执行return语句会直接返回StopIteration异常给调用者
*Tesla*的主页 *Tesla* | 小虾三级 | 园豆:1220
提问于:2025-12-02 10:21
< >
分享
所有回答(1)
0

这是一个很好的问题:

生成器函数中执行return语句会直接返回StopIteration异常给调用者

def gen():
    yield 1
    return "done"

g = gen()
print(next(g))        # 输出: 1
try:
    print(next(g))
except StopIteration as e:
    print("StopIteration value:", e.value)   # 输出: StopIteration value: done

第一步:g = gen()
这只是创建了一个生成器对象 g,函数体尚未执行。
第二步:next(g)
生成器开始执行:
遇到 yield 1,暂停执行,并将 1 返回。
此时,函数停在 yield 1 之后、return "done" 之前。

第三步:再次 next(g)
生成器从上次暂停的位置继续执行(即 yield 1 之后):
执行下一行:return "done"
一旦执行 return(无论有没有值),生成器就终止。
Python 自动抛出 StopIteration("done"),其中 "done" 是 StopIteration 实例的 .value 属性。
因此,第二次 next(g) 才会引发 StopIteration。


生成器在执行到 return 语句时会终止;
Python 解释器会自动引发一个 StopIteration 异常,用于向调用者(比如 for 循环或 next() 函数)表示迭代已经结束;
如果 return 后面带有值(如 return value),那么该值会被作为 StopException 异常的 value 属性传递出去


当你使用 for 循环遍历生成器时,Python 会自动捕获 StopIteration 并正常结束循环,所以你通常看不到这个异常。
手动调用 next() 时,如果生成器已经耗尽,就会看到 StopIteration 被抛出。



选项D的描述错误。在Python生成器函数中,执行return语句不会直接返回StopIteration异常给调用者;它会导致生成器函数结束,当下一次调用next()方法时,才会引发StopIteration异常。例如,当生成器函数执行return语句后,函数状态结束,但异常仅在后续next()调用时由调用者捕获。
选项C正确:yield语句暂停执行并保留状态,恢复时从该点继续。
*Tesla* | 园豆:1220 (小虾三级) | 2025-12-02 11:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册