获取生成器的子集

Ror*_*ory 23 python generator

我有一个发电机功能,想从中得到前10个项目; 我的第一次尝试是:

my_generator()[:10]
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为生成器不是可订阅的,因为错误告诉我.现在我已经解决了这个问题:

list(my_generator())[:10]
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为它将生成器转换为列表; 然而,这是低效的,并且失去了拥有发电机的重点.是否有一些内置的,Pythonic相当于[:10]发电机?

Ned*_*der 28

import itertools

itertools.islice(mygenerator(), 10)
Run Code Online (Sandbox Code Playgroud)

itertools有许多用于处理迭代器的实用程序. islice采用start,stop和step参数来切片迭代器就像切片列表一样.


Dus*_*etz 6

澄清上述评论:

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))
Run Code Online (Sandbox Code Playgroud)