一种方法是先查看第一个元素(如果有),然后创建并返回实际的生成器。
def head(iterable, max=10): first = next(iterable) # raise exception when depleted def head_inner(): yield first # yield the extracted first element for cnt, el in enumerate(iterable): yield el if cnt + 1 >= max: # cnt + 1 to include first break return head_inner()
只需在
chunk生成器中使用它,并
StopIteration像处理自定义异常一样捕获异常即可。
更新:
这是另一个版本,
itertools.islice用于替换大部分
head功能和一个
for循环。这个简单
for的事实,循环做
同样的事情 为笨重的
while-try-next-except-break原代码构造,所以结果是 很多 的可读性。
def chunks(iterable, size=10): iterator = iter(iterable) for first in iterator: # stops when iterator is depleted def chunk(): # construct generator for next chunk yield first # yield element from for loop for more in islice(iterator, size - 1): yield more # yield more elements from the iterator yield chunk() # in outer generator, yield next chunk
使用
itertools.chain替换内部生成器,我们可以得到比这更短的代码:
def chunks(iterable, size=10): iterator = iter(iterable) for first in iterator: yield chain([first], islice(iterator, size - 1))



