Python迭代器的__next__()方法与内置next()函数有什么区别?
核心结论
首先纠正你的误解:it.__next__()和next(it)两者都会修改迭代器对象,调用后会将迭代器的读取指针后移、消耗对应元素,不会保持迭代器状态不变。比如你给出的示例代码运行后,两行语句会依次返回2和3,最终迭代器it仅剩4一个元素。
两者的区别主要有三点:
- 定位与适用场景不同
next()是Python官方提供的公开内置函数,是普通业务代码中获取迭代器下一个元素的标准用法,符合Python的设计约定。而__next__()是Python的魔法方法,属于迭代器的内部实现接口,设计目的仅为给开发者自定义迭代器时重写逻辑使用,不属于给普通用户直接调用的公开API。Python约定所有双下划线开头的方法都属于内部实现细节,不建议业务代码直接调用。 - 功能丰富度不同
next()支持传入第二个参数作为迭代耗尽时的默认返回值,写法为next(it, 默认值),当迭代器没有剩余元素时会直接返回你指定的默认值,不会抛出StopIteration异常。而直接调用.__next__()没有这个能力,迭代耗尽时必然抛出异常。 - 兼容性更稳定
内置函数next()会自动做类型校验,确保传入的对象确实符合迭代器协议才会调用对应逻辑,适配所有符合Python规范的迭代器对象。而直接调用.__next__()如果遇到没有实现该方法的对象,只会直接抛出属性错误,没有额外的兼容处理。
对应Python之禅的约定,官方推荐的“唯一显而易见的实现方式”就是使用
next(),直接调用.__next__()属于非规范用法,仅在自定义迭代器的实现代码中才应该出现。
内容的提问来源于stack exchange,提问作者ClGide
相关产品推荐
相关产品推荐

