可迭代对象
1、迭代器
迭代是Python最强大的功能之一。初看起来,你可能会简单的认为迭代只不过是处理序列中元素的一种方法。 然而,绝非仅仅就是如此,还有很多你可能不知道的, 比如创建你自己的迭代器对象,在itertools模块中使用有用的迭代模式
迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
2、可迭代对象:
我们已经知道可以对list、tuple、str等类型的数据使用for...in...的循环语法从其中依次拿到数据进行使用,我们把这样的过程称为遍历,也叫迭代。但是,是否所有的数据类型都可以放到for...in...的语句中,然后让for...in...每次从中取出一条数据供我们使用,即供我们迭代吗?
也就说我们随便封装了一个可以存放多条数据的类型却并不能被迭代使用,我们把可以通过for...in...这类语句迭代读取一条数据供我们使用的对象称之为可迭代对象(Iterable)。
如何判断一个对象是否可以迭代?
from collections import Iterable
可以使用 isinstance() 判断一个对象是否是 Iterable 对象:

任何的序列(或者是可迭代对象)可以通过一个简单的赋值语句解压并赋值给多个变量。 唯一的前提就是变量的数量必须跟序列元素的数量是一样的。 如果变量个数和序列元素的个数不匹配,会产生一个异常。

实际上,这种解压赋值可以用在任何可迭代对象上面,而不仅仅是列表或者元组。 包括字符串,文件对象,迭代器和生成器。
可迭代对象的本质:
我们分析对可迭代对象进行迭代使用的过程,发现每迭代一次(即在for...in...中每循环一次)都会返回对象中的下一条数据,一直向后读取数据直到迭代了所有数据后结束。那么,在这个过程中就应该有一个“人”去记录每次访问到了第几条数据,以便每次迭代都可以返回下一条数据。我们把这个能帮助我们进行数据迭代的“人”称为迭代器(Iterator)。
可迭代对象的本质就是可以向我们提供一个这样的中间“人”即迭代器帮助我们对其进行迭代遍历使用。可迭代对象通过__iter__方法向我们提供一个迭代器,我们在迭代一个可迭代对象的时候,实际上就是先获取该对象提供的一个迭代器, 然后通过这个迭代器来依次获取对象中的每一个数据. 那么也就是说,一个具备了__iter__方法的对象,就是一个可迭代对象。
iter()函数与next()函数
list、tuple等都是可迭代对象,我们可以通过iter()函数获取这些可迭代对象的迭代器。然后我们可以对获取到的迭代器不断使用next()函数来获取下一条数据。
iter()函数实际上就是调用了可迭代对象的__iter__方法。
总结2点:
- ①可迭代对象要实现__iter__()方法,使之成为可迭代对象,同时方法中要返回迭代器对象引用
- ②迭代器是另一个类,要实现__iter__()和__next__()方法,只要有一个类中有__iter__和__next__方法,我们就称由这个类创建出来的对象叫迭代器


3、yield
简单地讲,yield 的作用就是把一个函数变成一个generator(生成器),带有yield 的函数不再是一个普通函数, Python解释器会将其视为一个generator,调用fab(5)不会执行fab函数,而是返回一个iterable对象! 在for循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值, 下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的, 于是函数继续执行,直到再次遇到 yield 。


生成器的启动方式:
