mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
358 字
1 分钟
迭代器与生成器
2026-03-13

迭代器与生成器#

定义#

迭代器是什么? 他是一个有__next__()的对象:可以一个个吐出数据。但是只能使用一次! 生成器是什么呢? 他是一个用yield写的函数:自动生成迭代器,并且只能遍历一次

核心价值是 惰性计算(Lazy Evaluation) —— 数据用时才生成,不用全塞内存.可以提高性能!

注意区分
list/tuple/dict = 可迭代对象(Iterable)→ 能造迭代器
generator = 迭代器(Iterator)→ 本身就是工人
可迭代对象:能被 for 循环的东西(有 __iter__ 方法)
迭代器:能被 next() 调用的东西(有 __iter__ + __next__ 方法)
所有迭代器都是可迭代对象,但反之不成立
迭代器协议 = __iter__ + __next__
__iter__:返回迭代器自身(或另一个迭代器)
__next__:返回下一个值,或抛 StopIteration
一个合格的迭代器必须要实现上面的两个方法,否则py可不认哦🤡

使用#

class Fatchicken:
def __init__(self,egg):
self.egg = egg
def __iter__(self):
return self#返回迭代器本身(必须实现!)
def __next__(self):
if self.egg<=0:
raise StopIteration #告诉for循环该结束了!
self.egg -=1
return self.egg+1#return会导致函数结束,所以__next__函数里先对数据操作再返回
aa = [i for i in Fatchicken(3)]
print(aa)

我们可以看到这个类实现了__init__,__iter__,__next__,对于迭代器来说,iter是必须实现的!next可以看需求。

内置迭代器#

可迭代对象都是c实现的哦!

可迭代对象迭代器类型获取方式特点
listlist_iteratoriter([1,2,3])按索引顺序
tupletuple_iteratoriter((1,2,3))不可变序列
strstr_iteratoriter("abc")返回单字符
setset_iteratoriter({1,2,3})无序(Python 3.7+ 有序但别依赖)
dictdict_keyiteratoriter({"a":1})默认迭代 key
dict.values()dict_valueiteratoriter(d.values())迭代 value
dict.items()dict_itemiteratoriter(d.items())迭代 (key, value)
函数返回类型示例特点
range()range_iteratoriter(range(3))超省内存!不生成列表
map()mapmap(str, [1,2])惰性计算
filter()filterfilter(bool, [1,0])惰性过滤
zip()zipzip([1],[2])并行迭代
enumerate()enumerateenumerate(['a'])带索引
reversed()list_reverseiteratorreversed([1,2,3])反向迭代(仅支持序列)

另外,文件本身也是迭代器!

with open('file.txt') as f:
print(type(f)) # <class '_io.TextIOWrapper'>
print(hasattr(f, '__next__')) # True → f就是迭代器
for line in f: # 逐行读,不加载全文件
pass

生成器#

生成器是迭代器的超集,生成器是迭代器,反之不成立😎

#手搓生成器
def eat(a):
while a>0:
yield a
a -=1
bb=[i for i in eat(3)]
print(bb)
yield 的魔法:
函数遇到 yield → 暂停执行,保存状态
下次调用 __next__() → 从暂停处继续
自动生成:
__iter__()
__next__()
StopIteration 处理

这些都是python内置实现好的,太方便啦!还不快感谢python!😎

胖狗注:最近因码字太多,决定偷懒!😋

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

迭代器与生成器
https://mizuki.mysqil.com/posts/diedaiqi/
作者
神秘大胖狗
发布于
2026-03-13
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00