理解 Python 的迭代器(Iterator),可以从“是什么、怎么用、为什么用、和生成器的关系”几个角度来看。
迭代器是一个可以记住遍历位置的对象,它让我们能够一个一个地取出数据,而不需要一次性把所有数据放在内存里。
在 Python 中:
迭代器 = 可迭代对象 + 迭代能力
更准确地说:
for 循环的东西(如 list、tuple、str、dict)__iter__() 和 __next__() 方法的对象一个对象要成为迭代器,必须实现两个方法:
__iter__() # 返回迭代器自身
__next__() # 返回下一个元素,没有元素时抛 StopIteration
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index >= len(self.data):
raise StopIteration
value = self.data[self.index]
self.index += 1
return value
使用:
it = MyIterator([1, 2, 3])
print(next(it)) # 1
print(next(it)) # 2
print(next(it)) # 3
# print(next(it)) # 抛 StopIteration
lst = [1, 2, 3]
# list 是可迭代对象,但不是迭代器
print(iter(lst)) # 得到一个迭代器
转换方式:
it = iter(lst)
next(it) # 1
✅ 总结一句话:
iter(可迭代对象) → 迭代器
for x in lst:
print(x)
等价于:
it = iter(lst)
while True:
try:
x = next(it)
print(x)
except StopIteration:
break
迭代器按需生成数据,不一次性存全部:
# 不好:一次性生成
nums = [i for i in range(100000000)]
# 好:迭代器
nums = (i for i in range(100000000))
class Counter:
def __init__(self):
self.n = 0
def __iter__(self):
return self
def __next__(self):
self.n += 1
return self.n
# 无限迭代
所有容器都能用 for 遍历,因为都遵循迭代协议。
生成器是迭代器的“语法糖”
def gen():
yield 1
yield 2
等价于手写迭代器,但简单得多。
✅ 生成器:
__iter__ 和 __next__yield 暂停函数迭代器就是“一次取一个”的对象,它让 Python 能优雅地处理序列、节省内存、支持无限数据。
如果你愿意,我也可以:
for / map / filter / 生成器 实战讲免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。