在 Python 的世界中 迭代是非常核心的概念 无论是
for循环 遍历列表 还是按需生成大量数据 背后都离不开迭代器与生成器的支持 理解它们不仅能让代码更高效 更优雅 还可以帮助你掌握 Python 内部运行的机制
本文将系统讲解迭代器与生成器的原理与实战应用
一 可迭代对象与迭代器的概念
在 Python 中 能够使用 for ... in ... 遍历的对象都被称为 可迭代对象 例如 列表 字符串 元组 字典 集合等
python
numbers = [1, 2, 3]
for n in numbers:
print(n)
在执行循环时 Python 会在内部把列表转化为一个 迭代器对象 然后通过迭代器逐个取出数据
迭代器是一个可以被 next() 函数调用并返回下一个元素的对象 每次调用 next() 时 迭代器都会记住当前位置 直到元素被取尽 抛出 StopIteration 异常
二 可迭代对象与迭代器的区别
| 类型 | 特征 | 举例 |
|---|---|---|
| 可迭代对象 | 实现了 __iter__() 方法 |
list dict set str |
| 迭代器对象 | 同时实现了 __iter__() 和 __next__() 方法 |
由 iter() 创建的对象 |
一个简单例子
python
numbers = [1, 2, 3]
it = iter(numbers) # 创建迭代器对象
print(next(it)) # 输出 1
print(next(it)) # 输出 2
print(next(it)) # 输出 3
# print(next(it)) # StopIteration 异常
iter() 函数用于将可迭代对象转化为迭代器 next() 用于从迭代器中取值
三 自定义迭代器
我们也可以自定义一个迭代器对象
python
class Counter:
def __init__(self, start, end):
self.current = start
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.current <= self.end:
value = self.current
self.current += 1
return value
else:
raise StopIteration
for num in Counter(1, 5):
print(num)
输出
1
2
3
4
5
这个例子中 __iter__() 返回迭代器本身 __next__() 返回下一个值 当没有更多内容时抛出 StopIteration
四 生成器的概念
生成器是 Python 提供的一种更优雅的创建迭代器的方式 它可以在不一次性占用大量内存的情况下 按需生成数据
生成器的本质是一种特殊的迭代器 通过 yield 关键字 定义函数即可创建生成器
五 创建生成器的两种方式
1 使用 yield 定义生成器函数
python
def count_down(n):
print("开始倒计时")
while n > 0:
yield n
n -= 1
for num in count_down(5):
print(num)
执行结果
开始倒计时
5
4
3
2
1
当函数中使用 yield 时 它不再是普通函数 而是生成器 每次调用 next() 或被 for 循环调用时 执行到 yield 处暂停 并返回当前值
2 使用生成器表达式
生成器表达式的语法与列表推导式类似 但使用小括号
python
squares = (x * x for x in range(5))
for s in squares:
print(s)
输出
0
1
4
9
16
相比列表推导式 生成器不会一次性生成所有数据 而是每次按需计算下一个结果 节省大量内存
六 生成器与 return 的区别
return会结束函数并返回一个值yield会暂停函数执行 并返回一个值 下次恢复执行
生成器函数可以多次返回中间结果 而不是一次性返回所有内容
七 send 方法与生成器通信
生成器还可以使用 send() 方法向内部发送数据 下面是一个简单的例子
python
def greeter():
name = yield "请输入你的名字"
yield f"你好 {name}"
g = greeter()
print(next(g)) # 输出 请输入你的名字
print(g.send("Alice")) # 输出 你好 Alice
这个特性在协程与异步编程中非常有用
八 实战 案例 用生成器读取大文件
当文件非常大时 一次性读取会占用大量内存 生成器可以按行读取 提高性能
python
def read_file(filename):
with open(filename, "r", encoding="utf-8") as f:
for line in f:
yield line.strip()
for line in read_file("data.txt"):
print(line)
这种按需读取方式在日志分析 数据处理等场景中非常常见
九 小结
迭代器和生成器是 Python 高效处理数据的重要机制 它们让我们可以用更少的内存处理大量数据
学习要点
- 可迭代对象是能被
for遍历的对象 - 迭代器实现了
__iter__()和__next__()方法 yield可让函数变为生成器 实现惰性计算- 生成器表达式比列表推导式更节省内存
- 在数据流和文件处理场景中非常实用
掌握迭代器与生成器 你就能写出更优雅更高效的 Python 程序