1、可迭代对象(iterable)
可迭代对象都有一个 __iter__() 方法,也就是说有 __iter__() 方法的对象,就是可迭代对象。
‘hello‘.__iter__ (1,2,3).__iter__ [1,2,3].__iter__ {‘a‘:1}.__iter__ {‘a‘,‘b‘}.__iter__ open(‘a.txt‘).__iter__
2、迭代器(iterator)
可迭代对执行obj.__iter__()得到的结果就是迭代器对象
迭代器对象:有__iter__()方法和__next__()方法,当没有数据可用时则将引发 StopIteration 异常。 或:迭代器有两个基本方法: iter() 返回一个迭代器对象, next() 逐一返回迭代对象中的项
文件类型是迭代器对象
from collections import Iterable from collections import Iterator open(‘data.txt‘).__iter__() open(‘data.txt‘).__next__() print(isinstance(open(‘data.txt‘), Iterable)) print(isinstance(open(‘data.txt‘), Iterator))
3、通过iter()函数返回可迭代对象的迭代器
from collections import Iterable from collections import Iterator dic = { ‘a‘:1, ‘b‘:2, ‘c‘:3, } print(isinstance(dic, Iterable))# 判断一个对象是否可以迭代 True print(isinstance(dic, Iterator))# 判断一个对象是否是迭代器 False dic_iter = dic.__iter__() #等同于dic_iter = iter(dic) print(dic_iter) print(isinstance(dic, Iterable))# 判断一个对象是否可以迭代 True print(isinstance(dic, Iterator))# 判断一个对象是否是迭代器 True
4、for循环
for k in dic: # for循环会自动调用__iter__(),生成一个迭代器 print(dic[k])
for循环的工作原理
1:执行in后对象的dic.__iter__()方法,得到一个迭代器对象iter_dic
2: 执行next(iter_dic),将得到的值赋值给k,然后执行循环体代码
3: 重复过程2,直到捕捉到异常StopIteration,结束循环
5、迭代器的优缺点
优点:1、提供了不依赖于索引的迭代方式(字典、集合、文件就没有索引)
2、惰性计算,只在需要时才调用__next__()方法获得下个值,同一时刻内存中只有一个值,可以存放无限大的数据
缺点:1、除非取尽,否则不能获得长度
2、不能回头
原文:https://www.cnblogs.com/cc-world/p/14014921.html