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

