这是一个很好的问题:
生成器函数中执行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语句暂停执行并保留状态,恢复时从该点继续。