【发布时间】:2018-09-01 23:59:48
【问题描述】:
生成器表达式是一个非常有用的工具,与列表推导相比有一个巨大的优势,那就是它不会为新数组分配内存。
我在使用生成器表达式时面临的问题是,我最终只能编写列表推导式,我只能使用一次这样的生成器:
>>> names = ['John', 'George', 'Paul', 'Ringo']
>>> has_o = (name for name in names if 'o' in name)
>>> for name in has_o:
... print(name.upper())
...
JOHN
GEORGE
RINGO
>>> for name in has_o:
... print(name.lower())
...
>>>
上面的代码说明了生成器表达式如何只能使用一次。这是当然的,因为生成器表达式返回生成器的一个实例,而不是定义一个可以一次又一次实例化的生成器函数。
有没有办法在每次使用生成器时对其进行克隆,以使其可重用,或者使生成器表达式语法返回生成器函数而不是单个实例?
【问题讨论】:
-
有
itertools.tee,但你不能同时拥有内存优化生成器和也让它可重用。如果您需要它来提高内存效率,则需要重新创建生成器,否则列表推导式可能就是您想要的。
标签: python generator generator-expression