list
、dict
、set
都可以通过 iter()
转换成迭代器。__iter__()
和 __next__()
方法。next()
会抛出 StopIteration
错误。my_list = [1, 2, 3]
it = iter(my_list) # 转换成迭代器
print(next(it)) # 输出 1
print(next(it)) # 输出 2
print(next(it)) # 输出 3
print(next(it)) # 抛出 StopIteration
DepthFirstIterator
)。yield
关键字定义。__iter__
和 __next__
。for
循环直接遍历。def count_up_to(n):
i = 1
while i <= n:
yield i # 每次 next() 调用时返回 i,并暂停在这里
i += 1
gen = count_up_to(3) # 返回生成器对象
print(next(gen)) # 输出 1
print(next(gen)) # 输出 2
print(next(gen)) # 输出 3
print(next(gen)) # 抛出 StopIteration
# 也可以用 for 循环
for num in count_up_to(3):
print(num) # 输出 1, 2, 3
yield
实现异步编程)。特性 | 迭代器(Iterator) | 生成器(Generator) |
---|---|---|
定义方式 | 需要实现 __iter__ 和 __next__ |
用 yield 定义函数 |
内存占用 | 可能占用较大内存(如 list ) |
惰性计算,省内存 |
代码简洁度 | 较复杂(需手动实现) | 更简洁 |
适用场景 | 自定义遍历逻辑 | 惰性计算、无限序列、协程 |
next()
)。__next__
)。def read_large_file(file_path):
with open(file_path, "r") as f:
for line in f:
yield line # 逐行读取,不占内存
for line in read_large_file("huge_log.txt"):
print(line)
✅ 生成器更合适,因为文件可能很大,直接 read()
会爆内存。
class Tree:
def __init__(self, value):
self.value = value
self.children = []
def __iter__(self):
return DepthFirstIterator(self) # 自定义迭代器
✅ 迭代器更合适,因为需要控制遍历顺序(如深度优先、广度优先)。
希望本文能让你搞懂迭代器和生成器!