赛博红兔的科技博客

CyberHongTu shares news, insights, and musings on fascinating technology subjects.


和我一起玩Python:32. 迭代器和生成器

今天我们聊聊Python的迭代器和生成器,它们对于处理数据集特别是大型数据集超级重要。迭代器让我们能够以一种省内存的方式顺序访问数据集,不需要一次性把整个数据集都加载进来。而生成器,一种特殊的迭代器,可以按需生成数据,让代码更简洁,性能更棒。

让我们先说说迭代器:

可迭代对象:就是那些你可以用for循环遍历的Python对象,比如列表、元组、集合、字典还有字符串。它们有个__iter__()方法,能返回一个迭代器。这些可迭代对象本身不会进行迭代,它们更像是可以被遍历的容器。

迭代器:这些才是真正进行迭代的家伙。它们会追踪迭代的当前状态,知道哪些元素已经被遍历了,下一个是哪个。迭代器有两个特殊方法:iter__和__next。__next__方法返回序列中的下一个元素,如果没有元素了就会抛出一个StopIteration异常。用完的迭代器不能复用,需要创建一个新的。

再来看看生成器:

生成器是一种特殊的迭代器,允许按需、顺序生成数据,而不是一次性创建并存储全部数据。通过带有yield语句的函数来实现。每次执行yield时,函数就会产生一个值并暂停,直到下一次调用。生成器在yield之间保持它们的状态。

所有的生成器都是迭代器,自动实现了__iter__()和__next__()方法。

生成器表达式:

跟列表推导式很像,生成器表达式提供了一种更简洁的方式来创建生成器。生成器和列表的区别在于,生成器用圆括号,列表用方括号。生成器表达式对内存友好,因为它们一次处理一个元素,适合大型数据集。与可以重复使用的列表不同,生成器只能迭代一次。

生成器的优点:

简化代码:使用函数和yield语句,生成器让编写迭代器代码更简单,无需手动实现迭代器的复杂性。

内存效率:像迭代器一样,生成器按需生成值,非常适合大型数据集。

自动保存状态:生成器自动记录当前状态信息,从上次离开的地方继续,无需手动管理。



Leave a comment