可迭代的对象、迭代器和生成器
迭代
迭代器模式:按需一次获取一个数据
迭代器的作用
for 循环使用
构建和扩展集合类型
逐行遍历文本文件
列表推导、字典推导和集合推导
元组拆包
调用函数时,使用*拆包实参
对象为什么可以迭代?
本质是因为对象能够得到一个迭代器
迭代器是从前往后不可反向的
如果没有__iter__方法返回迭代器但是实现了__getitem__方法,Python会通过这个方法自动生成一个按照索引的迭代器并使用
重点:所以支持序列式索引的一定支持迭代,但是支持迭代的不一定支持索引,比如集合或者生成器对象
迭代器是什么
广义上实现了__next__和__iter__方法的对象都可以看作是迭代器
迭代器抽象基类源码规范
生成器
只要Python函数的定义体中有yield关键字,该函数就是生成器函数。调用生成器函数会返回一个生成器对象,所有的生成器都是迭代器
yield:返回一个值并暂停函数,下次调用next()时从暂停位置继续执行
生成器可以简单看作不需要自己实现__next__和__iter__方法的迭代器对象
优点:通常不需要一次性将所有加载进入内存,只需要使用的时候选取即可
生成器表达式
(表达式 for 变量 in 可迭代对象 if 条件)
如果学过列表推导的应该很熟悉
注意迭代器以及生成器也是可迭代对象哦,所以完全可以通过一个生成器得到另一个生成器
yield from
如果生成器函数出现多层的for嵌套循环时使用,类似于从可迭代对象中取出值直接通过yield返回
标准库常用生成器
数量太多建议直接看itertools的官方文档介绍