python中的迭代器与生成器

发布时间:2026/8/9 12:58:35
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.a1返回对象self print(it) # 打印对象__main__.MyNumbers object at 0x... print(next(it)) # 调用 __next__ → 1 print(next(it)) # 调用 __next__ → 2iter(x)→ 调用x.__iter__()得到迭代器对象print(iter(myclass)) # 输出类似__main__.MyNumbers object at 0x0000021xxxx打印出来的是对象描述、内存地址不会执行next不会产生 1、2、3 这种数据。执行iter(myclass)的时候会跑__iter__里面代码self.a 1✅状态初始化发生在这里return self返回实例对象但是不会调用__next__不会计算、不会返回数字这一步打印不会输出业务数据数字、列表这些它返回的是迭代器对象本身打印对象看到的是对象内存信息不是迭代产出的值。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.a1这个 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)) # 10next才会拿到产出的值运行实例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区分两件事极易混淆函数定义里面写了 yield只是告诉 Python这是生成器。此时什么都不发生。程序执行流运行到 yield 这行语句才会暂停 向外产出值。写在代码里 ≠ 程序已经跑到这行执行了。一句话记住规则写yield a≠ 立刻把 a 算出来返回yield a只是定义了一个「将来被 next () 调用时要产出什么值」。函数只有遇到 next () /for 循环才会真正跑内部代码。