当前位置: 首页 > news >正文

python中的迭代器与生成器

迭代器:

两个基本的方法:iter()next()

  • __iter__() 方法返回一个特殊的迭代器对象, 这
  • 个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。
  • __next__() 方法会返回下一个迭代器对象。

核心区分

class MyNumbers: def __iter__(self): self.a = 1 return self # 返回自己,作为迭代器 def __next__(self): x = self.a self.a += 1 return x myclass = MyNumbers() it = iter(myclass) # 执行 __iter__,self.a=1,返回对象self print(it) # 打印对象:<__main__.MyNumbers object at 0x...> print(next(it)) # 调用 __next__ → 1 print(next(it)) # 调用 __next__ → 2
  • iter(x)→ 调用x.__iter__()得到迭代器对象

    print(iter(myclass)) # 输出类似:<__main__.MyNumbers object at 0x0000021xxxx>

    打印出来的是对象描述、内存地址,不会执行next,不会产生 1、2、3 这种数据

执行iter(myclass)的时候:

  1. 会跑__iter__里面代码:self.a =1✅(状态初始化发生在这里!)
  2. return self返回实例对象
  3. 但是不会调用__next__,不会计算、不会返回数字
  4. 这一步打印不会输出业务数据(数字、列表这些),它返回的是迭代器对象本身,打印对象看到的是对象内存信息,不是迭代产出的值。
  • next(迭代器对象)→ 调用__next__()才拿到实际的元素值

    it = iter(myclass) print(next(it)) # 输出 1

📌一句话记忆:iter()负责造迭代器工具;next()负责驱动工具产出数据。

总结表

代码执行的方法返回什么print 之后看到什么
iter(x)x.__iter__()迭代器对象对象内存信息,没有业务数据
next(it)it.__next__()迭代出来的元素真实数据,比如1,2,3

易错点提醒:

__iter__只是做初始化、返回迭代器;真正产生每一个值,是交给next/ next()

就算__iter__内部初始化了self.a=1,这个 1 只是变量状态,不会自动跑出来,必须等next()调用__next__才会取出来返回。

生成器函数(带 yield):

只要 Python 看到函数定义体内存在 yield,它就把这个函数标记为生成器函数。

def gen(): yield 10 g = gen() # 等价于 iter(...) 的效果,拿到生成器迭代器对象。生成器自动实现iter和next,简化代码 print(g) # <generator object gen at 0x...>,打印对象,拿不到10 print(next(g)) # 10,next才会拿到产出的值

运行实例:

def gen(): print("开始执行函数内部") yield 100 g = gen() # 第0步,仅仅构造生成器,返回一个生成器对象,这个对象处于休眠状态,需要next唤醒,并没有执行函数 print("这里是g = gen()之后")#打印结果 print(next(g))#激活对象之后,开始执行函数,根据函数定义先打印"开始执行函数内部",再通过yield输出100

调用生成器函数时:

  • 不执行函数里面任何一行代码
  • 直接返回一个「生成器对象」,保存函数的入口位置、局部变量的上下文
  • 这个对象处于休眠状态,等着 next() 来唤醒
  • yield 不是 return。
  • yield 是暂停指令,它生效的前提是代码执行流走到这一行。 没被 next 唤醒,代码流根本走不到 yield a 那一行,自然不可能输出 a。
#以下是执行结果 这里是g = gen()之后 开始执行函数内部 100

区分两件事(极易混淆):

  1. 函数定义里面写了 yield:只是告诉 Python,这是生成器。此时什么都不发生。
  2. 程序执行流运行到 yield 这行语句:才会暂停 + 向外产出值。

写在代码里 ≠ 程序已经跑到这行执行了。

一句话记住规则

  • yield a≠ 立刻把 a 算出来返回
  • yield a只是定义了一个「将来被 next () 调用时,要产出什么值」。
  • 函数只有遇到 next () /for 循环才会真正跑内部代码。
http://www.jsqmd.com/news/1359419/

相关文章:

  • Windows更新修复终极指南:Reset Windows Update Tool完整手册
  • Linux服务器CPU满载排查与优化实战指南
  • LeetCode链表专题:K组翻转、旋转与去重实战
  • 命令行赋能云端存储:BaiduPCS-Go如何革新网盘管理体验
  • 从AI领袖动向看技术趋势:Discovery Loop与行业信号解读
  • 3个技巧让你快速掌握OBS背景移除:从新手到高手的完整指南
  • 遗传算法与高斯基函数在非线性系统识别中的应用
  • Docker部署Halcyon Video:为Jellyfin构建专业3D影片元数据解决方案
  • 揭秘AMD Ryzen处理器的终极调试工具:SMUDebugTool深度解析与实战指南
  • DDrawCompat:三步解决Windows 10/11经典游戏运行问题的终极方案
  • 三分钟上手ofd.js:浏览器端OFD文档渲染终极指南
  • iOS激活锁绕过终极指南:applera1n工具5步解锁iPhone完整方案
  • 筛选乐从钢铁世界经销商,注意售后响应与配送时效
  • 终极指南:如何让经典《暗黑破坏神2》在现代电脑上流畅运行
  • 若依AI助手Docker部署实战:从环境变量到服务依赖的避坑指南
  • ArcGIS Pro圆弧半径自动计算与标注工具开发与应用指南
  • Mos:彻底解决Mac外接鼠标滚动卡顿,让你的滚轮爽如触控板
  • Windows更新终极修复指南:5分钟解决所有更新问题
  • Linux命令与快捷键实战:提升运维效率的核心技巧
  • 如何5分钟快速掌握Onekey Steam清单下载器:终极游戏管理指南
  • 如何在浏览器中免费解锁加密音乐文件:Unlock-Music完整指南 [特殊字符]
  • 无需安装的网页版三国杀:随时随地享受跨平台策略对战
  • AI代码评估新趋势:从SWE-bench到动态多维度测试体系
  • AI 应用只会聊天不会干活?MCP 正在把“工具接入“变成标准协议
  • 300元以内半入耳蓝牙耳机,音质、降噪、续航哪个更重要?
  • 腾讯混元大模型Hy3 API接入指南:低成本高性能AI应用开发实践
  • 暗黑破坏神2存档修改器终极指南:5分钟打造完美角色
  • 游戏跨界创作全流程:从IP融合到4K视频制作
  • C++游戏引擎骨骼蒙皮动画实现:从原理到GPU渲染全解析
  • TCP/IP协议栈解析:从基础原理到性能优化