Python3 迭代器与生成器详解
                           
天天向上
发布: 2025-03-14 22:44:15

原创
124 人浏览过

在 Python 中,迭代器(Iterator)生成器(Generator) 是处理数据流和集合的重要工具。理解它们的概念及其区别,将帮助我们在处理大规模数据时节省内存并提高效率。


1. 迭代器(Iterator)

1.1 迭代器是什么?

迭代器是实现了迭代协议的对象。迭代协议指的是 __iter__()__next__() 方法。所有可迭代的对象(如列表、元组、字典、集合等)都可以通过迭代器进行访问。

迭代器协议

  • __iter__():返回迭代器对象本身。
  • __next__():返回下一个元素。如果没有更多元素,抛出 StopIteration 异常。

1.2 迭代器的创建

创建迭代器

可以通过 iter() 函数将一个可迭代对象转换为迭代器对象:

lst = [1, 2, 3]
iterator = iter(lst)
print(next(iterator))  # 1
print(next(iterator))  # 2
print(next(iterator))  # 3
# print(next(iterator))  # StopIteration 异常

1.3 迭代器的特点

  • 迭代器是 惰性求值,即每次调用 next() 返回一个元素,而不是一次性返回所有元素。
  • 迭代器在没有元素时会抛出 StopIteration 异常。

2. 生成器(Generator)

2.1 生成器是什么?

生成器是一个特殊的迭代器,它是通过 生成器函数(使用 yield 关键字)或 生成器表达式 创建的。生成器是惰性求值的,只在需要时生成数据,因此它们非常适合用于处理大数据集或流式数据。

2.2 生成器的创建

2.2.1 生成器函数

生成器函数与普通函数的不同之处在于,它包含 yield 关键字。每次遇到 yield 时,函数会暂停执行,并返回一个值。下一次调用时,函数会从上次 yield 处继续执行。

def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()
print(next(gen))  # 1
print(next(gen))  # 2
print(next(gen))  # 3
# print(next(gen))  # StopIteration 异常

2.2.2 生成器表达式

生成器表达式类似于列表推导式,但它返回一个生成器对象,而不是整个列表。它使用小括号 () 来创建。

gen_expr = (x ** 2 for x in range(3))
print(next(gen_expr))  # 0
print(next(gen_expr))  # 1
print(next(gen_expr))  # 4
# print(next(gen_expr))  # StopIteration 异常

2.3 生成器的特点

  • 惰性求值:生成器每次返回一个值,直到完全耗尽。
  • 节省内存:生成器不会一次性创建所有的值,而是按需生成数据。
  • 支持迭代:生成器可以用于 for 循环等迭代操作。
  • 只能遍历一次:生成器一旦消耗完数据,不能重新开始迭代。

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

特性迭代器生成器
定义实现了迭代协议(__iter__()__next__()通过 yield 关键字或生成器表达式创建
创建方式通过 iter() 将可迭代对象转为迭代器使用生成器函数或生成器表达式
内存使用创建时生成整个对象按需生成,节省内存
是否支持一次性遍历可以重新创建迭代器进行遍历不支持重新遍历,已耗尽后不能重用
执行方式逐个元素返回每次 yield 暂停并返回一个值
使用场景适用于需要多次访问数据的场景适用于流式数据、节省内存的大数据场景

4. 迭代器与生成器的应用实例

4.1 迭代器的应用:读取大文件

可以使用迭代器逐行读取大文件,避免一次性加载整个文件,节省内存。

def read_large_file(file_name):
    with open(file_name, 'r') as file:
        for line in file:
            yield line.strip()  # 使用 yield 逐行返回

for line in read_large_file('large_file.txt'):
    print(line)

4.2 生成器的应用:生成无限序列

生成器可以用于生成无限序列,例如斐波那契数列:

def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

fib = fibonacci()
for i in range(10):
    print(next(fib))  # 0 1 1 2 3 5 8 13 21 34

5. 总结

  • 迭代器 是遵循迭代协议的对象,适合用于遍历可迭代对象。
  • 生成器 是一种特殊的迭代器,通过 yield 创建,用于按需生成数据,具有节省内存的优势。
  • 迭代器和生成器 都支持惰性求值,只有在需要时才会计算并返回结果。

迭代器和生成器在数据流处理、大规模数据集的遍历和节省内存方面非常有用。掌握它们能帮助你编写高效且内存友好的 Python 程序。更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *