可迭代的对象、迭代器和生成器

迭代

迭代器模式:按需一次获取一个数据

迭代器的作用

for 循环使用

构建和扩展集合类型

逐行遍历文本文件

列表推导、字典推导和集合推导

元组拆包

调用函数时,使用*拆包实参

对象为什么可以迭代?

本质是因为对象能够得到一个迭代器

迭代器是从前往后不可反向的

如果没有__iter__方法返回迭代器但是实现了__getitem__方法,Python会通过这个方法自动生成一个按照索引的迭代器并使用

重点:所以支持序列式索引的一定支持迭代,但是支持迭代的不一定支持索引,比如集合或者生成器对象

迭代器是什么

广义上实现了__next__和__iter__方法的对象都可以看作是迭代器

迭代器抽象基类源码规范

生成器

只要Python函数的定义体中有yield关键字,该函数就是生成器函数。调用生成器函数会返回一个生成器对象,所有的生成器都是迭代器

yield:返回一个值并暂停函数,下次调用next()时从暂停位置继续执行

生成器可以简单看作不需要自己实现__next__和__iter__方法的迭代器对象

优点:通常不需要一次性将所有加载进入内存,只需要使用的时候选取即可

生成器表达式

(表达式 for 变量 in 可迭代对象 if 条件)

如果学过列表推导的应该很熟悉

注意迭代器以及生成器也是可迭代对象哦,所以完全可以通过一个生成器得到另一个生成器

yield from

如果生成器函数出现多层的for嵌套循环时使用,类似于从可迭代对象中取出值直接通过yield返回

标准库常用生成器

数量太多建议直接看itertools的官方文档介绍