← 中文资源

简体中文版本

把迭代器切成固定大小的批次

用 islice 惰性消费任意可迭代对象,每次返回固定大小的列表,保留最后不足一批的数据,并在源耗尽时自然结束。

阅读英文原文

功能说明

chunked 把任意可迭代对象按固定大小切成列表批次。它先用 iter() 拿到迭代器,再循环调用 islice(iterator, size),每次最多消费 size 个元素;最后一批不足时原样返回,源耗尽后生成器自然结束。整个过程中不会把全部数据读进内存,适合分页请求、批量写库或逐块上传。

关键代码

iterator = iter(items)
while True:
    batch = list(islice(iterator, size))
    if not batch:
        return
    yield batch

islice 会推进同一个迭代器,因此批次之间不会重复,也不会跳过元素。

使用注意

  • size 必须大于 0,示例在第一次迭代时才校验,因此调用方要消费生成器才能看到错误。
  • 返回的是列表而不是元组,方便调用方在批内继续修改。
  • 生成器是惰性的,源文件句柄或数据库游标会在批次消费期间保持打开。
  • 对无限迭代器使用时,需要调用方自行在外部 break,否则会一直产出。
  • 如果源本身支持切片,直接切片可能更快,但通用实现不需要 len() 或下标。

验证方式

示例把 1 到 10 按 3 个一批切分,应得到 [1, 2, 3]、[4, 5, 6]、[7, 8, 9]、[10] 四批;空输入返回空列表,最后不足 5 个的生成器返回一批;size=0 会打印错误信息。