0

0

Python 迭代器协议的完整实现方式

冷漠man

冷漠man

发布时间:2026-01-28 16:56:02

|

838人浏览过

|

来源于php中文网

原创

完整迭代器必须同时实现__iter__和__next__:__iter__需返回含__next__的对象(通常为self),__next__耗尽时须显式抛StopIteration;状态应存于实例属性而非类属性;支持多次迭代需每次__iter__返回新实例;生成器函数可更安全地替代手动实现。

python 迭代器协议的完整实现方式

__iter__ 和 __next__ 必须同时存在才能算完整迭代器

只实现 __iter__ 返回自身,却不定义 __next__,对象无法被 next() 调用,会抛出 TypeError: iterator does not have a __next__() method。反之,仅实现 __next__ 而没实现 __iter__,则无法用于 for 循环或 list() 等消费迭代器的场景,因为这些操作内部先调用 iter(),而 iter(obj) 要求对象必须有 __iter__ 方法(且返回一个迭代器)。

完整实现的关键是:

  • __iter__ 必须返回一个实现了 __next__ 的对象(通常是 self
  • __next__ 必须在耗尽时显式抛出 StopIteration,不能靠返回 None 或静默退出
  • 多次调用 iter() 应该能获得独立的迭代状态(除非你刻意设计为单次可迭代)

手动管理状态时容易忽略的边界情况

比如实现一个从 0 数到 n 的计数器迭代器,常见错误是把索引初始化写在类属性里,导致所有实例共享状态:

class BadCounter:
    i = 0  # ❌ 类变量,所有实例共用
    def __init__(self, n):
        self.n = n
    def __iter__(self):
        return self
    def __next__(self):
        if self.i >= self.n:
            raise StopIteration
        val = self.i
        self.i += 1
        return val

正确做法是把状态放在实例属性中:

class GoodCounter:
    def __init__(self, n):
        self.n = n
        self.i = 0  # ✅ 实例变量
    def __iter__(self):
        return self
    def __next__(self):
        if self.i >= self.n:
            raise StopIteration
        val = self.i
        self.i += 1
        return val

另一个易错点:__next__ 中未处理 self.i 超出范围的瞬间(比如 n=0 时首次调用就该抛异常),会导致无限循环或越界访问。

立即学习Python免费学习笔记(深入)”;

支持多次迭代需返回新迭代器实例

如果希望同一个对象能被多次 for 遍历(比如 listrange 的行为),就不能让 __iter__ 总是返回 self。否则第二次遍历时,内部状态已耗尽,直接抛 StopIteration

解决方式是让 __iter__ 每次都新建一个干净的迭代器:

Murf AI
Murf AI

AI文本转语音生成工具

下载
class RepeatableRange:
    def __init__(self, stop):
        self.stop = stop
    def __iter__(self):
        return RepeatableRangeIterator(self.stop)  # ✅ 新实例
<p>class RepeatableRangeIterator:
def <strong>init</strong>(self, stop):
self.stop = stop
self.i = 0
def <strong>next</strong>(self):
if self.i >= self.stop:
raise StopIteration
val = self.i
self.i += 1
return val
def <strong>iter</strong>(self):
return self

注意:RepeatableRangeIterator 自身也要实现 __iter__(返回自身),否则 iter(it) 会失败。

用生成器函数替代手动实现更安全

手动维护 __iter__ + __next__ 容易出状态错乱、漏抛 StopIteration、忘记重置等问题。Python 提供了更简洁可靠的替代:在 __iter__ 中返回一个生成器。

例如等价于上面 GoodCounter 的写法:

class GeneratorBasedCounter:
    def __init__(self, n):
        self.n = n
    def __iter__(self):
        i = 0
        while i < self.n:
            yield i
            i += 1

这种写法天然支持多次迭代(每次调用 __iter__ 都启一个新的生成器)、自动处理 StopIteration、无需手动管理状态变量生命周期。唯一要注意的是:生成器函数不能被 next() 直接调用(得先 iter()),但这本来就是迭代器协议的要求。

真正需要手写协议的场景其实很少——多数时候是封装底层流、资源或需要精细控制暂停/恢复逻辑时才值得深入。其他情况,生成器函数或 yield 就够用了。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

chatgpt官网入口地址合集
chatgpt官网入口地址合集

本专题整合了chatgpt官网入口地址、使用教程等内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

minimax入口地址汇总
minimax入口地址汇总

本专题整合了minimax相关入口合集,阅读专题下面的文章了解更多详细地址。

4

2026.03.16

C++多线程并发控制与线程安全设计实践
C++多线程并发控制与线程安全设计实践

本专题围绕 C++ 在高性能系统开发中的并发控制技术展开,系统讲解多线程编程模型与线程安全设计方法。内容包括互斥锁、读写锁、条件变量、原子操作以及线程池实现机制,同时结合实际案例分析并发竞争、死锁避免与性能优化策略。通过实践讲解,帮助开发者掌握构建稳定高效并发系统的关键技术。

7

2026.03.16

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

114

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

141

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

396

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

65

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

111

2026.03.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5.1万人学习

SciPy 教程
SciPy 教程

共10课时 | 2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号