python迭代器简单理解 __iter__和__next__方法
在使用for语句的时候,相当于python内部把for后面的对象使用了iter()方法。
a = [1, 2, 3]
for i in a:
do_something()
for i in iter(a):
do_something()
iter()的返回是一个迭代对象,主要映射到了类里的__iter__()方法。
对于使用iter()方法的对象,返回值为对象中的__iter__()方法的返回值。
iter()方法返回的是一个实现了__next__()方法的对象,由该对象实现的__next__()方法来完成实际的迭代。
class Node:
def __iter__(self):
return iter([1, 2, 3])
if __name__ == "main":
n = Node()
for i in n:
print(i)
结果为:
1
2
3
Iterable:有迭代能力的对象,一个类,实现了__iter__(),就认为有迭代能力,通常此函数必须返回一个实现了__next__()的对象,如果自己实现了,可以返回self(返回值不是必须的)。
Iterator:迭代器,同时实现了__iter__()和__next__()的对象。(若某个自定义类只实现了__next__()而未实现__iter__()则会报错)
在调用iter()方法的时候(例如for循环时),生成了一个迭代对象,要求__iter__()返回一个实现了__next__()的对象,可通过next()方法访问这个对象的下一个元素。如果不添加StopIteration异常,会不断迭代,for循环会捕捉这个异常并停止迭代。
class MyIter:
def __init__(self):
self._start = 0
def __iter__(self):
return self
def __next__(self):
if self._start < 10:
self._start += 1
return self._start
else:
raise StopIteration
if __name__ == '__main__':
a = MyIter()
for i in a:
print(i)
结果:
1
2
3
4
5
6
7
8
9
10
如果同时实现了__iter__()和__next__()方法,且__iter__()没有返回self,调用iter方法时会返回__iter__()返回的结果
class MyIter:
def __init__(self):
self._start = 0
def __iter__(self):
return iter([1, 2, 3])
def __next__(self):
if self._start < 10:
self._start += 1
return self._start
else:
raise StopIteration
if __name__ == '__main__':
a = MyIter()
for i in a:
print(i)
结果:
1
2
3
调用iter()方法时,iter()仅会被调用一次,next()则会多调用多次。
具体体现:
class MyIter:
def __init__(self):
self._start = 0
def __iter__(self):
self._start += 8
return self
def __next__(self):
if self._start < 10:
self._start += 1
return self._start
else:
raise StopIteration
if __name__ == '__main__':
a = MyIter()
for i in a:
print(i)
结果:
9
10
迭代器的优点:
- 如果采用列表的方式遍历,会将列表中所有内容载入内存;如果使用迭代器,只有调用了next()方法时才会返回对应的结果,可以节约内存。
- 不依赖索引的读取方式。
迭代器的缺点: - 只能往后取值,不能往前取值;不能指定某一个值。
- 无法预测迭代器的长度。
不能指定某一个值体现于:
a = iter([1, 2, 3])
print(a[1])
Traceback (most recent call last):
File "D:/Project/python_fundamental/iterator_try/main.py", line 23, in <module>
print(a[1])
TypeError: 'list_iterator' object is not subscriptable
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?