Python中的迭代器与生成器
字数 858 2025-11-03 08:33:37

Python中的迭代器与生成器

描述
迭代器(Iterator)和生成器(Generator)是Python中用于处理可迭代对象的重要概念。迭代器允许你逐个访问容器中的元素而不暴露其底层结构,而生成器则是一种更简洁的迭代器实现方式,通过函数和yield关键字动态生成值。理解它们有助于高效处理大数据流或惰性计算场景。

1. 迭代器的基本概念

  • 可迭代对象(Iterable):任何实现了__iter__方法的对象(如列表、元组、字符串),该方法返回一个迭代器。
  • 迭代器(Iterator):实现了__iter__(返回自身)和__next__(返回下一个值,无值时抛出StopIteration异常)方法的对象。
  • 示例
    my_list = [1, 2, 3]
    iter_obj = iter(my_list)  # 等价于 my_list.__iter__()
    print(next(iter_obj))  # 输出 1(等价于 iter_obj.__next__())
    print(next(iter_obj))  # 输出 2
    

2. 自定义迭代器
通过类实现迭代器协议:

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:
            raise StopIteration
        value = self.current
        self.current += 1
        return value

# 使用示例
for num in Counter(0, 3):
    print(num)  # 输出 0, 1, 2

关键点:迭代器只能遍历一次,遍历完成后需重置才能重新使用。

3. 生成器的引入
自定义迭代器需要编写类,代码较繁琐。生成器提供了一种更简单的实现方式:

  • 生成器函数:使用yield关键字代替return,每次调用next()时执行到yield处暂停,保留状态,下次继续执行。
  • 示例
    def counter_generator(start, end):
        current = start
        while current < end:
            yield current
            current += 1
    
    gen = counter_generator(0, 3)
    print(next(gen))  # 输出 0
    print(next(gen))  # 输出 1
    

生成器函数返回一个生成器对象(一种迭代器),无需手动实现__iter____next__

4. 生成器的惰性计算优势
生成器按需生成值,节省内存,适合处理大规模数据流:

def infinite_sequence():
    num = 0
    while True:
        yield num
        num += 1

gen = infinite_sequence()
print(next(gen))  # 输出 0
print(next(gen))  # 输出 1
# 不会无限占用内存,每次只生成一个值

5. 生成器表达式
类似列表推导式,但使用圆括号,返回生成器对象:

squares_gen = (x**2 for x in range(5))
print(next(squares_gen))  # 输出 0
print(list(squares_gen))   # 输出 [1, 4, 9, 16](注意已消耗0)

与列表推导式(立即返回所有结果)相比,生成器表达式惰性求值,更节省内存。

6. 迭代器与生成器的区别

  • 迭代器:需显式实现类协议,适合复杂状态管理。
  • 生成器:通过函数和yield简化实现,适合顺序数据流。
  • 共同点:均支持for循环和next()函数,且只能单向遍历一次。

总结
迭代器和生成器是Python惰性计算的核心工具。迭代器通过协议规范遍历行为,生成器则以其简洁语法成为更常用的实现方式,尤其在处理流式数据或无限序列时能显著提升效率。

Python中的迭代器与生成器 描述 迭代器(Iterator)和生成器(Generator)是Python中用于处理可迭代对象的重要概念。迭代器允许你逐个访问容器中的元素而不暴露其底层结构,而生成器则是一种更简洁的迭代器实现方式,通过函数和 yield 关键字动态生成值。理解它们有助于高效处理大数据流或惰性计算场景。 1. 迭代器的基本概念 可迭代对象(Iterable) :任何实现了 __iter__ 方法的对象(如列表、元组、字符串),该方法返回一个迭代器。 迭代器(Iterator) :实现了 __iter__ (返回自身)和 __next__ (返回下一个值,无值时抛出 StopIteration 异常)方法的对象。 示例 : 2. 自定义迭代器 通过类实现迭代器协议: 关键点 :迭代器只能遍历一次,遍历完成后需重置才能重新使用。 3. 生成器的引入 自定义迭代器需要编写类,代码较繁琐。生成器提供了一种更简单的实现方式: 生成器函数 :使用 yield 关键字代替 return ,每次调用 next() 时执行到 yield 处暂停,保留状态,下次继续执行。 示例 : 生成器函数返回一个生成器对象(一种迭代器),无需手动实现 __iter__ 和 __next__ 。 4. 生成器的惰性计算优势 生成器按需生成值,节省内存,适合处理大规模数据流: 5. 生成器表达式 类似列表推导式,但使用圆括号,返回生成器对象: 与列表推导式(立即返回所有结果)相比,生成器表达式惰性求值,更节省内存。 6. 迭代器与生成器的区别 迭代器 :需显式实现类协议,适合复杂状态管理。 生成器 :通过函数和 yield 简化实现,适合顺序数据流。 共同点 :均支持 for 循环和 next() 函数,且只能单向遍历一次。 总结 迭代器和生成器是Python惰性计算的核心工具。迭代器通过协议规范遍历行为,生成器则以其简洁语法成为更常用的实现方式,尤其在处理流式数据或无限序列时能显著提升效率。