【python3零基础入门】No7.迭代器与生成器
·
1. 本章核心概念
迭代器(Iterator)
- 可以记住遍历位置的对象
- 从集合第一个元素开始访问,直到结束
- 只能前进,不可后退
- 依赖两个方法:
iter()、next() - 字符串、列表、元组等都可以创建迭代器
生成器(Generator)
- 使用
yield的函数 - 本质上是迭代器
- 每次执行到
yield会暂停,下次从暂停处继续 - 按需生成值,节省内存
- 适合大量数据或无限序列
2. 关键语法与机制
iter()
- 将可迭代对象转换为迭代器
- 示例:
it = iter([1,2,3])
next()
- 获取迭代器的下一个值
- 若无更多元素 → 抛出
StopIteration
StopIteration
- 用于标识迭代结束
- 自定义迭代器时必须手动抛出
yield
- 暂停函数执行并返回值
- 下次迭代从暂停处继续
- 生成器函数必须包含至少一个
yield
3. 示例代码(可直接运行)
示例 1:基础迭代器
list = [1, 2, 3, 4]
it = iter(list)
print(next(it))
print(next(it))
示例 2:for 遍历迭代器
list = [1, 2, 3, 4]
it = iter(list)
for x in it:
print(x, end=" ")
示例 3:while + try/except
import sys
list = [1, 2, 3, 4]
it = iter(list)
while True:
try:
print(next(it))
except StopIteration:
sys.exit()
示例 4:自定义迭代器
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x
myiter = iter(MyNumbers())
print(next(myiter))
print(next(myiter))
示例 5:限制次数并触发 StopIteration
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration
for x in MyNumbers():
print(x)
示例 6:生成器函数(倒计时)
def countdown(n):
while n > 0:
yield n
n -= 1
generator = countdown(5)
print(next(generator))
print(next(generator))
print(next(generator))
for value in generator:
print(value)
示例 7:生成器实现斐波那契
import sys
def fibonacci(n):
a, b, counter = 0, 1, 0
while True:
if counter > n:
return
yield a
a, b = b, a + b
counter += 1
f = fibonacci(10)
while True:
try:
print(next(f), end=" ")
except StopIteration:
sys.exit()
4. 常见错误与坑
- 忘记处理
StopIteration - 生成器只能遍历一次
- 在生成器中混用
return和yield - 自定义迭代器忘记抛出
StopIteration - 误以为生成器会一次性生成所有数据
5. 实战应用场景
- 大文件逐行读取
- 无限序列
- 数据流处理(pipeline)
- 异步编程基础(yield from → asyncio)
更多推荐

所有评论(0)