收录查询站长工具,企业网站新模式,一个具体网站的seo优化方案,网站建设费无形资产摊销在 Python 中#xff0c;**迭代器#xff08;Iterator#xff09;和生成器#xff08;Generator#xff09;**都是用于处理可迭代对象的工具#xff0c;它们支持惰性计算#xff08;按需生成值#xff09;#xff0c;能高效处理大数据流或无限序列。以下是详细解释和对…在 Python 中**迭代器Iterator和生成器Generator**都是用于处理可迭代对象的工具它们支持惰性计算按需生成值能高效处理大数据流或无限序列。以下是详细解释和对比 一、迭代器Iterator
核心概念
定义 迭代器是实现了迭代器协议的对象即包含 __iter__() 和 __next__() 方法。 __iter__()返回迭代器自身通常就是 self。__next__()返回下一个元素若无元素则抛出 StopIteration 异常。
特性 惰性求值一次只生成一个元素节省内存。单向遍历只能前进不能后退。一次性使用遍历结束后需重新创建才能再次迭代。
示例
# 自定义迭代器
class CountDown:def __init__(self, start):self.current startdef __iter__(self):return selfdef __next__(self):if self.current 0:raise StopIterationnum self.currentself.current - 1return num# 使用迭代器
countdown CountDown(3)
for num in countdown:print(num) # 输出3, 2, 1 二、生成器Generator
核心概念
定义 生成器是一种特殊的迭代器通过函数和 yield 关键字简化创建过程。 函数中使用 yield 代替 return每次 yield 返回一个值并暂停函数状态。调用生成器函数返回一个生成器对象自动实现迭代器协议。
特性 更简洁的语法无需手动定义 __iter__() 和 __next__()。状态保存函数局部变量和执行状态在 yield 间自动保留。支持无限序列如无限计数器。
示例
# 生成器函数
def count_down(start):current startwhile current 0:yield current # 暂停并返回值current - 1# 使用生成器
gen count_down(3)
for num in gen:print(num) # 输出3, 2, 1# 生成器表达式类似列表推导式
gen_expr (x for x in range(3, 0, -1))
print(list(gen_expr)) # 输出[3, 2, 1] 三、关键区别 特性 迭代器 (Iterator) 生成器 (Generator) 实现方式 需手动定义 __next__ 方法 用 yield 自动实现 语法复杂度 较复杂需写类 简洁函数形式 内存占用 低惰性计算 低惰性计算 适用场景 自定义复杂迭代逻辑 快速创建惰性序列 状态保存 需手动管理状态 自动保存函数状态 四、常见用法
1. 迭代文件内容避免一次性加载大文件
def read_large_file(file_path):with open(file_path, r) as file:for line in file: # 文件对象本身就是迭代器yield line.strip()for line in read_large_file(data.txt):process(line) # 逐行处理
2. 生成无限序列
def infinite_counter():count 0while True:yield countcount 1gen infinite_counter()
print(next(gen)) # 0
print(next(gen)) # 1
3. 管道式处理数据流
def filter_even(numbers):for n in numbers:if n % 2 0:yield ndef square(numbers):for n in numbers:yield n ** 2# 组合生成器
nums [1, 2, 3, 4, 5]
pipeline square(filter_even(nums))
print(list(pipeline)) # 输出[4, 16] 五、总结
迭代器基础协议适合需要精细控制迭代逻辑的场景。生成器迭代器的语法糖更简洁适合快速创建惰性序列。共同优势 ✅ 节省内存处理大数据 ✅ 支持无限序列 ✅ 兼容 for 循环、next() 等迭代操作
通过合理使用迭代器和生成器可以显著提升 Python 程序的效率和可读性。