获取生成器的子集

28 投票
2 回答
5532 浏览
提问于 2025-04-16 01:07

我有一个生成器函数,想从中获取前十个项目;我第一次尝试是:

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 函数可以接收开始位置、结束位置和步长这几个参数,来对迭代器进行切片,就像我们对列表进行切片一样简单。

撰写回答