358 字
1 分钟
迭代器与生成器
迭代器与生成器
定义
迭代器是什么? 他是一个有__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实现的哦!
| 可迭代对象 | 迭代器类型 | 获取方式 | 特点 |
|---|---|---|---|
list | list_iterator | iter([1,2,3]) | 按索引顺序 |
tuple | tuple_iterator | iter((1,2,3)) | 不可变序列 |
str | str_iterator | iter("abc") | 返回单字符 |
set | set_iterator | iter({1,2,3}) | 无序(Python 3.7+ 有序但别依赖) |
dict | dict_keyiterator | iter({"a":1}) | 默认迭代 key |
dict.values() | dict_valueiterator | iter(d.values()) | 迭代 value |
dict.items() | dict_itemiterator | iter(d.items()) | 迭代 (key, value) |
| 函数 | 返回类型 | 示例 | 特点 |
|---|---|---|---|
range() | range_iterator | iter(range(3)) | 超省内存!不生成列表 |
map() | map | map(str, [1,2]) | 惰性计算 |
filter() | filter | filter(bool, [1,0]) | 惰性过滤 |
zip() | zip | zip([1],[2]) | 并行迭代 |
enumerate() | enumerate | enumerate(['a']) | 带索引 |
reversed() | list_reverseiterator | reversed([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 -=1bb=[i for i in eat(3)]print(bb)yield 的魔法:函数遇到 yield → 暂停执行,保存状态下次调用 __next__() → 从暂停处继续自动生成:__iter__()__next__()StopIteration 处理这些都是python内置实现好的,太方便啦!还不快感谢python!😎
胖狗注:最近因码字太多,决定偷懒!😋
部分信息可能已经过时









