获取生成器的子集
我有一个生成器函数,想从中获取前十个项目;我第一次尝试是:
my_generator()[:10]
这个方法不行,因为生成器不能像列表那样用下标访问,错误信息也告诉了我这一点。目前我用以下方法解决了这个问题:
list(my_generator())[:10]
这个方法可以用,因为它把生成器转换成了一个列表;不过,这样做效率不高,失去了使用生成器的意义。有没有什么内置的、符合Python风格的方法,可以像[:10]
那样直接获取生成器的前十个项目呢?
2 个回答
7
为了更清楚地说明上面的评论:
from itertools import islice
def fib_gen():
a, b = 1, 1
while True:
yield a
a, b = b, a + b
assert [1, 1, 2, 3, 5] == list(islice(fib_gen(), 5))
33
import itertools
itertools.islice(mygenerator(), 10)
itertools
是一个可以帮助我们处理迭代器的工具库。里面的 islice
函数可以接收开始位置、结束位置和步长这几个参数,来对迭代器进行切片,就像我们对列表进行切片一样简单。