You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中处理next()调用抛出的StopIteration异常

Python中处理next()调用抛出的StopIteration异常

嘿,这个场景我太熟悉了!用itertuples遍历大DataFrame的时候,手动调用next()批量跳过元素,确实会在迭代器耗尽时触发StopIteration异常,这里有两个惯用的处理方案,你可以根据需求选择:

方案一:直接捕获StopIteration异常

最直接的方式就是把批量调用next()的逻辑包裹在try-except块里,当异常触发时,说明迭代器已经走到末尾了,我们直接跳出循环就行:

it = df.itertuples()
for row in it:
    if 你的条件满足:
        try:
            # 尝试跳过19条记录
            [next(it) for _ in range(19)]
        except StopIteration:
            # 迭代器已经没有更多元素了,直接退出外层循环
            break
    # 这里写你处理当前行的业务逻辑
    ...

这种方式逻辑清晰,能精准处理迭代器耗尽的情况,不会让程序崩溃。不过要注意,用列表推导式会生成一个包含19个行对象的无用列表,对于超大DataFrame来说虽然影响不大,但多少有点浪费内存。

方案二:用itertools.islice安全跳过元素(更Pythonic)

这其实是更推荐的写法,itertools.islice专门用来从迭代器中截取指定数量的元素,就算迭代器剩余元素不足指定数量,它也只会取完剩下的所有元素,不会抛出任何异常。而且它不会生成无用的列表,效率更高:

from itertools import islice

it = df.itertuples()
for row in it:
    if 你的条件满足:
        # 用islice跳过最多19条记录,不够的话就取完剩下的
        # 直接遍历islice返回的迭代器来耗尽它
        for _ in islice(it, 19):
            pass
    # 这里写你处理当前行的业务逻辑
    ...

或者你也可以用一行代码搞定(不过上面的写法可读性更好):

next(islice(it, 19, 19), None)

原理是islice(it, 19)生成一个最多包含19个元素的迭代器,我们遍历它就相当于跳过了这些元素,当迭代器里没元素了,islice也会安静地停止,外层的for循环随后也会自然结束,完全不需要处理异常,非常省心。

备注:内容来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 16:54:39