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,所以就不会再次打印,这就是缺陷

分开写的话,第二次调用可迭代对象的时候,会重新初始化迭代器之后再次运行