如何改写Python生成器代码以避免显式循环逐个yield内部元素?
改写方案
方法1:用yield from直接委托生成器
Python 3.3之后提供了yield from语法,能直接把内部生成器的所有结果转出去,不用手动写循环挨个yield:
def my_range(start, stop, step): yield from range(start, stop, step)
方法2:直接返回range对象(看需求场景)
range本身就是支持惰性迭代的可迭代对象,如果你的调用方只是需要遍历、做列表推导这类操作,直接返回它就行,比写生成器更高效:
def my_range(start, stop, step): return range(start, stop, step)
补充说明
yield from完全等价于原代码里的循环yield逻辑,但代码更简洁,还能自动处理内部生成器的异常传递等细节。- 如果你必须返回一个严格的生成器类型(而不是range序列),那优先选第一种方法;如果对类型没要求,直接返回range是最优解。
内容的提问来源于stack exchange,提问作者user3310334
相关产品推荐
相关产品推荐

