截断 python 生成器

Truncating a python generator

我想知道编写生成器表达式的 Pythonic 方法,该表达式采用无限生成器 g 的前 n 个元素。目前,我正在这样做:

(x for x,_ in zip(g,range(n)))

是否有更 Pythonic 的方法来做到这一点?

itertools.islice(g,0,10)

应该做吗?

您可能需要 list(itertools.islice(g,0,10))(因为它 returns 是一个迭代器)

islice

itertools.islice 包装在函数中很有意义,代码比我下面的替代方案短得多:

from itertools import islice

def first_n(iterable, n):
    return islice(iterable, 0, n)

和用法:

>>> first_n(range(100), 10)
<itertools.islice object at 0xffec1dec>
>>> list(first_n(range(100), 10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

或直接:

>>> list(islice(range(100), 0, 10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

替代发电机

这里有一个替代方案:

def first_n(iterable, n):
    it = iter(iterable)
    for _ in range(n):
        yield next(it)

和用法:

>>> first_n(range(100), 10)
<generator object first_n at 0xffec73ec>
>>> list(first_n(range(100), 10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

来自docislice有签名:

itertools.islice(iterable, stop)
itertools.islice(iterable, start, stop[, step])

所以你可以使用:

g2 = itertools.islice(g, 10)