因此,我正在编写一个函数,其中在循环体中进行大量处理,有时调用者可能会对某些计算的答案感兴趣。
通常,我只是将结果放入列表中并返回列表,但是在这种情况下,结果太大(每个循环数百MB)。
我写这篇文章时并没有真正考虑,而是期望Python的动态类型可以解决问题,但是以下内容始终是作为生成器创建的。
def mixed(is_generator=False):
for i in range(5):
# process some stuff including writing to a file
if is_generator:
yield i
return
由此我有两个问题:
1)范围内是否存在yield
关键字是否立即将其对象变成了生成器?
2)是否有一种明智的方式来获得我想要的行为?
2.1)如果否,则其背后的原因是什么? (关于函数和生成器在Python中的工作方式。)
让我们逐步进行:
1)范围中是否存在yield关键字是否会立即将其对象变成生成器?是
2)是否有一种明智的方式来获得我想要的行为?是的,请参见下面的示例
要做的是包装计算并返回生成器或包含该生成器数据的列表:
def mixed(is_generator=False):
# create a generator object
gen = (compute_stuff(i) for i in range(5))
# if we want just the generator
if is_generator:
return gen
# if not we consume it with a list and return that list
return list(gen)