截断 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]
来自doc,islice
有签名:
itertools.islice(iterable, stop)
itertools.islice(iterable, start, stop[, step])
所以你可以使用:
g2 = itertools.islice(g, 10)
我想知道编写生成器表达式的 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]
来自doc,islice
有签名:
itertools.islice(iterable, stop)
itertools.islice(iterable, start, stop[, step])
所以你可以使用:
g2 = itertools.islice(g, 10)