在 Python 中,迭代器(Iterator) 和 生成器(Generator) 是实现惰性计算和高效大数据处理的核心机制。本文小编与大家分享 Python 迭代器和生成器的相关知识。
【小编提示】 惰性计算(Lazy Evaluation):也称为惰性求值或懒惰求值,是一种编程技术,其核心思想是仅在真正需要时才计算表达式的值(延迟计算和最小化求值)。这种方法可以显著提高程序的性能,避免不必要的计算,特别适合处理大数据、无限序列等场景。 |
一、迭代器
(一)什么是迭代器
迭代器(Iterator)是能逐个遍历元素的对象,迭代器需要实现 __iter__() 和 __next__() 方法,这两个方法也被称为迭代器协议。
(二)迭代器获取和使用
1、将迭代器对象转为迭代器
列表、元组、字典等容器可通过 iter() 函数 转为迭代器,并使用 next() 函数 访问迭代器中的下一个元素,如果已到末尾再次调用 next() 函数将抛出StopIteration 异常。
除 next() 函数外,还可以使用 for 循环访问迭代器中的元素,不过 for 循环只需要遍历迭代器对象即可。因为 for 循环的实质上做了以下操作:
当然,如果将迭代器对象转换为迭代器,这种访问方式仍然可行。
2、自定义迭代器
可以自定义迭代器,需手动实现 __iter__() 和 __next__() 方法。
Python 迭代器适用于高效迭代、数据流处理、节省内存、数据转换等场景。它允许我们按需获取数据,而不是一次性加载所有数据,在处理大规模数据时尤为重要。
二、迭代器对象与迭代器
迭代器对象是指实现了 __iter__() 方法,调用后能返回一个迭代器的对象。能被 for 循环遍历的对象都是可迭代对象,比如:列表、字符串、元组 、字典、集合等。
迭代器对象它们本身不直接进行迭代,而是通过 iter() 函数转换为迭代器后供循环使用 。
而迭代器则需要实现 __iter__() 和 __next__() 方法。迭代器是惰性计算的,只能一次性使用(遍历完就失效,无法重复遍历),且只能向后遍历,不能回退。
三、生成器
在 Python 中,使用了 yield 关键字的函数被称为生成器(generator)。yield 关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果,调用一个生成器函数,返回的是一个迭代器对象。生成器是简化版的迭代器,无需手动写类、实现 __iter__() 和 __next__(),Python 自动帮我们完成。
当在生成器函数中使用 yield 语句时,函数的执行将会暂停,并将 yield 后面的表达式作为当前迭代的值返回。然后,每次调用生成器的 next() 方法或使用 for 循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇到 yield 语句。这样,生成器函数可以逐步产生值,而不需要一次性计算并返回所有结果。
生成器函数的优势是可以按需生成值,避免一次性生成大量数据并占用大量内存。此外,生成器还可以与其他迭代工具(如 for 循环)无缝配合使用,提供简洁和高效的迭代方式。生成器的主要应用场景在需要处理大量数据且无法一次性加载到内存时,例如:读取大文件、流数据处理、无限序列生成等,这些在后续文章会进行介绍。