itertools.batched()默认保留不足batch_size的尾部元素,作为较短元组返回;不丢弃、不填充、不报错。常见未见最后一组是因消耗型迭代器中途退出或误用所致。

itertools.batched() 默认丢弃不足 batch_size 的尾部元素?
不是。itertools.batched()(Python 3.12+)**默认保留最后一组不足 batch_size 的元素**,作为较短的元组返回。它不会丢弃、填充或报错,行为是“原样截断并返回”。
为什么有时看不到最后一组?——常见误用场景
实际没看到最后一组,往往是因为你用在了消耗型迭代器上(比如文件行、生成器),且在循环中途用了 break 或异常退出;或者误以为它像 itertools.islice() 那样只取整批。
- 它对输入迭代器是严格按顺序分块,不预读、不缓存整段,但会完整遍历到底
- 如果源迭代器本身提前耗尽(例如
range(5)被其他逻辑提前终止),那当然拿不到最后一批 - 检查是否在
for batch in batched(...):循环里加了if len(batch) 这类逻辑
和手动实现的 batch 工具比,它不支持 padding
itertools.batched() 没有 fillvalue 参数,也不接受填充策略。如果你需要固定长度批次(如用 None 补齐最后一组),得自己封装或换用 more-itertools 的 chunked()(带 fill)或手写:
from itertools import islicedef batched_padded(iterable, n, fillvalue=None): iterator = iter(iterable) while batch := tuple(islice(iterator, n)): yield batch + (fillvalue,) * (n - len(batch))
性能与兼容性提醒
它是 C 实现的,比纯 Python 手写快;但仅限 Python 3.12+。旧版本用 more-itertools.batched 或上述 islice 方式替代时,要注意:前者返回列表,后者返回元组 —— 类型差异可能影响下游逻辑,比如你写了 batch.append(...) 就会报 AttributeError。
最容易被忽略的是:它返回的是 tuple,不是 list,且每批长度最多为 batch_size,最小为 1(只要输入还有剩余元素)。










