目录
一、迭代器
1 什么是迭代器
- 迭代器是 Python 中实现了迭代协议(即包含
__iter__()和__next__()方法)的对象; - 用于逐个访问容器中的元素;
- 其核心特性是惰性计算:仅在需要时才生成下一个元素,而非一次性加载所有数据到内存;
- 迭代器适合处理大规模数据或无限序列。
迭代器的工作流程如下:
- 通过
__iter__()方法返回自身(使对象可迭代)。 - 通过
__next__()方法返回下一个元素,当元素耗尽时抛出StopIteration异常,终止迭代。
可迭代对象(Iterable)与迭代器不同:
- 可迭代对象实现
__iter__()方法,返回一个迭代器。 - 迭代器既实现
__iter__()又实现__next__()。
2 迭代器的创建
转换可迭代对象:使用 iter() 函数将列表、元组、字典等可迭代对象转换为迭代器。
list1 = [2, 34, 56, 3, 43, 4]
print(list1)
# 把list1转换为可迭代对象
iter1 = iter(list1) # 从list1对象中获取迭代器
print(iter1)
# 到内存里面去拿我要的数据
print(next(iter1)) # 从迭代器中拿取第一个元素
print(next(iter1)) # 执行完到这儿时指针已经指向56
# 继续拿:循环,从指针指向的位置(56)开始循环
for i in iter1:
print(i)
# 示例:将字符串转换为迭代器
s = "hello"
it = iter(s)
print(next(it)) # 输出:h
3 自定义迭代器
自定义迭代器需在类中实现 __iter__() 和 __next__() 方法
class CountIterator:
def __init__(self, start, end):
self.current = start # 初始值
self.end = end # 终止值
def __iter__(self):
return self # 返回迭代器自身
def __next__(self):
if self.current <= self.end:
result = self.current
self.current += 1 # 更新状态
return result
else:
raise StopIteration # 终止迭代
# 使用自定义迭代器
counter = CountIterator(1, 3)
for num in counter:
print(num) # 输出:1、2、3
4 迭代器使用场景
- 处理大型数据集:如读取大文件时,通过迭代器逐行读取(而非一次性加载整个文件),减少内存占用。
class LogFileIterator:
def __init__(self, file_path):
self.file_path = file_path
self.file_obj = None
def __iter__(self):
# 打开文件并返回迭代器自身
self.file_obj = open(self.file_path, "r", encoding="utf-8")
return self
def __next__(self):
if self.file_obj is None:
raise StopIteration("File not opened")
# 读取下一行,文件结束时抛出 StopIteration
line = self.file_obj.readline()
if not line:
self.file_obj.close() # 关闭文件
raise StopIteration
return line.strip() # 去除行尾换行符
ger = LogFileIterator('00.iree.json')
for i in ger:
print(i)
- 遍历自定义数据结构:如链表、树等复杂结构,通过迭代器封装遍历逻辑,简化访问方式。
- 实现无限序列:如生成无限递增的整数序列(需手动控制终止条件)。
二、生成器
1 什么是生成器
- 生成器是一种特殊的迭代器,无需手动实现
__iter__()和__next__()方法,而是通过yield关键字定义。 - 其核心特性是状态暂停与恢复:生成器函数执行到
yield时返回值并暂停,下次调用时从暂停处继续执行。
生成器优势:
- 代码更简洁,无需手动管理迭代状态。
- 天然支持惰性计算,内存效率极高。
2 生成器示例
1.1 生成器函数
- 通过
yield关键字定义函数,调用时返回生成器对象。
# 死循环
# 用yield返回不会死机,因为是一帧一帧处理的
def my_generator(n):
i = 0
while True:
i += 1
yield f'{i}画面'
if i > n:
break
gen = my_generator(1000)
for i in gen:
print(i)
1.2 生成器表达式
- 类似列表推导式,用
()替代[],直接创建生成器。
# 生成器表达式:生成1-10的平方
square_generator = (x**2 for x in range(1, 11))
for num in square_generator:
print(num) # 输出:1、4、9、...、100
3 生成器使用场景
- 处理海量数据:如生成 100 万条测试数据时,生成器按需生成,避免占用大量内存。
# 生成器批量生成测试数据
def test_data_generator(size):
for i in range(size):
yield {"id": i, "value": f"test_{i}"}
# 按需获取100万条数据
for data in test_data_generator(1000000):
save_to_db(data) # 逐条写入数据库
- 实现协程:利用生成器的暂停 / 恢复特性,实现简单的协程(如异步任务调度)。
- 管道式数据处理:多步数据处理流程中,用生成器串联各步骤(如数据清洗→转换→输出),减少中间变量存储。
三、迭代器与生成器的区别
| 对比维度 | 迭代器 | 生成器 |
|---|---|---|
| 实现方式 | 需自定义类,实现 __iter__() 和 __next__() | 用 yield 函数或生成器表达式,无需手动实现迭代方法 |
| 代码复杂度 | 较高(需管理迭代状态) | 较低(语法简洁,状态自动维护) |
| 内存效率 | 较高(惰性计算) | 更高(无额外状态存储) |
| 适用场景 | 复杂数据结构遍历、自定义迭代逻辑 | 海量数据处理、简单序列生成、协程 |
| 状态控制 | 需手动更新迭代索引(如 self.index) | 自动保存暂停时的状态(变量值、执行位置) |
- 核心区别:生成器是迭代器的 “简化版”,用更简洁的语法实现迭代功能,适合快速开发;迭代器更灵活,适合复杂场景的定制化实现。
注意!!!!!
迭代器和生成器是 Python 中极为关键的概念,在数据处理、性能优化以及代码设计等诸多方面都发挥着重要作用,堪称 Python 编程进阶之路上必须深入掌握的核心知识点。
1174

被折叠的 条评论
为什么被折叠?



