Python 分块iterables,包括生成器

Python 分块iterables,包括生成器,python,iterator,Python,Iterator,我有一个用于分块iterables的解决方案: def块(项目、块大小): def get_chunk(): 尝试: 对于范围内的(块大小): 生成下一个(迭代器) 除停止迭代外: 返回错误 迭代器=iter(项目) while chunk:=列表(get_chunk()): 屈服块 对于块中的c([1,2,3,4,5,6,7,8],3): 印刷品(c) 它运行良好,与我在上找到的其他一些解决方案不同,它还处理“无限”生成器,如: def natural_number(): n=0 尽管如此:

我有一个用于分块iterables的解决方案:

def块(项目、块大小):
def get_chunk():
尝试:
对于范围内的(块大小):
生成下一个(迭代器)
除停止迭代外:
返回错误
迭代器=iter(项目)
while chunk:=列表(get_chunk()):
屈服块
对于块中的c([1,2,3,4,5,6,7,8],3):
印刷品(c)
它运行良好,与我在上找到的其他一些解决方案不同,它还处理“无限”生成器,如:

def natural_number():
n=0
尽管如此:
收益率(n:=n+1)
十=块(自然数(),10)
对于范围(5)内的uu:
打印(下一张(十张))
然而,我不能动摇这样一种感觉,即不需要调用内部函数就可以实现。当然,您可以定义一个外部函数并传入
chunk\u size
iterator
,这将避免在每次调用
chunk
时重新定义
get\u chunk()
。但它仍然会有为每个块调用该函数的开销

是否有人建议避免函数调用,但仍然适用于无法索引或切片的iterable

我使用该函数的主要原因是能够捕获
StopIteration
,我认为在生成器理解中不可能在不丢失异常前的最后几项的情况下完成该操作,但可能我错了。

使用while循环:

def chunks(items, chunk_size):
    iterator = iter(items)
    done = False
    while not done:
        chunk = []
        for _ in range(chunk_size):
            try:
                chunk.append(next(iterator))
            except StopIteration:
                done = True
                break
        if chunk:
            yield chunk
使用for循环:

def chunks(items, chunk_size):
    iterator = iter(items)
    chunk = []
    for element in iterator:
        chunk.append(element)
        if len(chunk) == chunk_size:
            yield chunk
            chunk = []
    if chunk:
        yield chunk
保留原始想法,但删除嵌套函数:

from itertools import islice

def chunks(items, chunk_size):
    iterator = iter(items)
    while chunk := list(islice(iterator, chunk_size)):
        yield chunk
使用第三方库:

>>> from more_itertools import chunked
>>> list(chunked([1, 2, 3, 4, 5, 6, 7, 8], 3))
[[1, 2, 3], [4, 5, 6], [7, 8]]

如果我没有弄错的话,
more itertools
已经
chunked
ichunked


我要找的是
,谢谢!