在 Python 中,迭代器(Iterator)是一种用于逐个访问容器中元素的对象,而不需要一次性把所有数据加载到内存中。
可迭代对象(Iterable)
能被 for 循环遍历的对象,比如:
listtupledictsetstr判断是否可迭代:
from collections.abc import Iterable
print(isinstance([1,2,3], Iterable)) # True
迭代器(Iterator)
是一个特殊的对象,满足两个条件:
__iter__() 方法(返回自身)__next__() 方法(返回下一个元素,没有时抛 StopIteration)判断是否迭代器:
from collections.abc import Iterator
print(isinstance(iter([1,2,3]), Iterator)) # True
lst = [1, 2, 3]
# 可迭代对象
print(hasattr(lst, "__iter__")) # True
print(hasattr(lst, "__next__")) # False
# 迭代器
it = iter(lst)
print(hasattr(it, "__iter__")) # True
print(hasattr(it, "__next__")) # True
it = iter([1, 2, 3])
print(next(it)) # 1
print(next(it)) # 2
print(next(it)) # 3
print(next(it)) # 抛出 StopIteration
用 for 循环本质就是:
it = iter([1, 2, 3])
while True:
try:
x = next(it)
print(x)
except StopIteration:
break
class MyRange:
def __init__(self, n):
self.n = n
self.i = 0
def __iter__(self):
return self
def __next__(self):
if self.i < self.n:
val = self.i
self.i += 1
return val
else:
raise StopIteration
for x in MyRange(3):
print(x)
✅ 惰性计算(节省内存)
✅ 只能向前,不能回退
✅ 用完即“耗尽”
it = iter([1,2,3])
list(it) # [1,2,3]
list(it) # []
__iter__ 和 __next__def gen(n):
for i in range(n):
yield i
g = gen(3)
print(next(g)) # 0
如果你愿意,我也可以帮你:
iter() 的内部机制免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。