1、什么是迭代器
迭代器可以在访问集合的时候更加方便,比如for…in…就是使用迭代器完成的,如果没有迭代器我们只能使用while循环,每次循环的时候只能通过下标访问了
2、可迭代对象
(1)用来做什么:直接给for循环遍历的对象
(2)常见的数据类型:元组,字典,集合,字符串,生成器等
(3)需要满足的条件:如果一个对象有一个__iter__方法,并且这个方法返回一个迭代器对象,这个对象就是可迭代对象
3、判断一个对象是否可迭代
可以使用isinstance()判断一个对象是否是可迭代对象




老版本是从collections导入,新版是从collections.abc导入
4、自定义一个可迭代对象


就像定义所说,有__iter__的方法就是可迭代对象
5、迭代器对象
(1)用来做什么:用来返回数据,每次循环的时候都会调用迭代器的__next__或者next方法,通过这个方法获取数据
(2)需要满足的条件:在Python2中,实现了next和__iter__方法,并且在这个对象中返回了值得对象,叫做迭代器对象
在Python3中,实现了__next__和__iter__方法,并且在这个对象中返回了值得对象,叫做迭代器对象
如果迭代器没有返回值,那么应该在next或者__next__方法会抛出一个StopIteration异常
6、判断迭代器对象


7、自定义迭代器(可以用for循环遍历的类)
定义一个类似于range()的类


测试:


8、for循环的原理
for循环底层先从可迭代对象Myrange中的__iter__方法拿到一个迭代器MyrangeIterator,然后去调用迭代器的__next__方法,每循环一次就可以拿到一个值
9、利用while循环来模拟for循环


10、将一个对象变成即是可迭代对象又是迭代器

对于一个可迭代对象只需要实现__iter__方法返回一个迭代器对象,那么只需要返回自己即可,然后迭代器是实现了__iter__和__next__方法的,那么剩下只需要去实现__next__方法即可,这样这个类即是可迭代对象又是迭代器。
看似好像是简化代码,但是还是和分成2个写的有区别
在连续调用2次的时候会发生问题


会发现第二次根本没有运行,原因是第一次完成之后的ret对象中的index属性是10,再次调用的时候index还是10,所以就不会再次打印,这就是缺陷
分开写的话,第二次调用可迭代对象的时候,会重新初始化迭代器之后再次运行