1、为何要有迭代器?
对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。
但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器
2、什么是可迭代对象?
可迭代对象
- 以直接作用于 for 循环的数据类型有以下几种:
- 一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;
- 一类是 generator ,包括生成器和带 yield 的generator function。
- 这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。
判断是否可以迭代?
可以使用 isinstance() 判断一个对象是否是 Iterable 对象:
In [1]: from collections import Iterable In [2]: isinstance({}, Iterable) Out[2]: True In [3]: isinstance(100, Iterable) Out[3]: False
可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__,如下:
- 'world'.__iter__
- (4,5,6).__iter__
- [1,2,3].__iter__
- {'a':1}.__iter__
- {'a','b'}.__iter__
- open('a.txt').__iter__
3、什么是迭代器对象?
- 可迭代对象执行obj.__iter__()得到的结果就是迭代器对象
- 而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象
- 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可以使用 isinstance() 判断一个对象是否是 Iterator 对象:(用法与isinstance一样)
实例:
a='abcdefg' a1={'a','b','c','d','e'} a2={'a':1,'b':12,'c':'cd'} res=iter(a1) #集合无序 print(next(res)) print(next(res)) print(next(res)) >>> e >>> d >>> c res2=iter(a2) #字典出来的是key print(next(res2)) print(next(res2)) >>> a >>> b res=iter(a1) n=0 whilen<len(a2): print(next(res)) n += 1 >>> d >>> e >>> c
4、文件类型是迭代器对象
open('a.txt').__iter__()
open('a.txt').__next__()
5、总结:
1、凡是可作用于 for 循环的对象都是 Iterable 类型;
2、凡是可作用于 next() 函数的对象都是 Iterator 类型;
3、集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数转化成 Iterator 对象;
4、生成器不但可以作用于 for 循环,还可以被 next() 函数不断调用并返回下一个值,直到最后抛出 StopIteration 错误表示无法继续返回下一个值了。