什么是迭代器:
对于迭代:迭代就是重复的过程,每次重复都是基于上一次的结果
所以,迭代器可以理解为一种迭代取值的工具
为什么要有迭代器:
对于列表,元组,字符串这些有序的数据类型来说,可以通过索引取值,而对于字典,集合,文件这些,索引的方式就行不通,所以python为我们提供了一种可以不依赖索引的通用迭代取值方式--->依靠迭代器取值
怎么用迭代器:
1.可迭代对象:在python中但凡拥有内置的__iter__()方法的都是可迭代对象(列表,字典,元组,字符串,文件,集合...)
2:迭代器对象:在python中但凡拥有内置的__next__()方法的都是迭代器对象
3.如何获得迭代器对象:可迭代对象执行内置的__iter__()方法得到的就是迭代器对象
x = [1,2] res = x.__iter__() #---> 可以简写成 res = iter(x)
4:如何通过迭代器迭代取值:执行迭代器下的内置__next__()方法,就可以取出值
x = [1,2] res = iter(x) print(res.__next__()) #--->可以简写成next(res)
当整个可迭代对象遍历完后,抛出异常(可以理解为:Stopiteration为迭代结束标志)
x = [1,2] res = iter(x) print(next(res)) print(next(res)) print(next(res)) #执行结果---> #StopIteration
迭代器本身也拥有内置的__iter__()方法,迭代器执行__iter__()方法获得的是迭代器本身
x = [1,2] res = iter(x) print(res.__iter__() is res) #执行结果---> #True
那么为什么要给迭代器增加这个对迭代器来说看似鸡肋的__iter__()方法
for循环实现原理:语法 for i in (可迭代对象):
for 循环遵循迭代协议,执行in后面的可迭代对象的内置__iter__()方法--->得到迭代器对象,执行迭代器对象内置的_next_()
方法--->将其得到的返回值与in前面的变量名形成绑定关系,周而复始,知道迭代器抛出异常,for循环接受异常,结束循环
那么,for循环是首先触发in后面的__iter__方法,而为了实现统一,for循环不必判断循环对象是可迭代对象还是迭代器对象,所以给迭代器增加了一个__iter__方法,其得到的仍然是本身
总结 :
迭代器的优点:1.提供了一种可以不依赖索迭代引取值的通用方式
2:一次在内存中只有一个值,节省内存空间
缺点:1.只能一次次的迭代取值,不能像索引,及字典的key-value映射关系快速取值
2.只能往前取值,不能后退
3:不能用len()去统计其长度