功能说明
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 会打印错误信息。