循环中直接调用生成器函数与存储生成器对象的差异
两种生成器遍历写法的差异分析
先看示例代码:
def yield_range(x): for i in range(x): yield i for x in yield_range(10): print(x) yr_result = yield_range(10) for x in yr_result: print(x)
这两种写法没有本质差异,执行结果完全一致——都会依次打印0到9的数字。
具体解释:
- 第一种写法直接在
for循环中调用yield_range(10),此时会创建一个生成器实例,循环过程中生成器以惰性求值的方式逐个产出值,遍历结束后这个生成器就会被耗尽。 - 第二种写法只是提前把
yield_range(10)创建的生成器实例赋值给了yr_result变量,后续再通过这个变量遍历生成器。本质逻辑和第一种完全相同,同样是惰性产出值,遍历完成后生成器也会被耗尽。
唯一的区别是是否将生成器对象提前存储:如果后续需要对这个生成器做额外操作(比如手动调用next()方法),提前存到变量里会更方便;如果只是一次性遍历,两种写法没区别。
内容的提问来源于stack exchange,提问作者jaypeg
相关产品推荐
相关产品推荐

