python之路---可迭代对象与迭代器

什么是迭代器:

对于迭代:迭代就是重复的过程,每次重复都是基于上一次的结果

所以,迭代器可以理解为一种迭代取值的工具

为什么要有迭代器: 

对于列表,元组,字符串这些有序的数据类型来说,可以通过索引取值,而对于字典,集合,文件这些,索引的方式就行不通,所以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()去统计其长度

  

猜你喜欢

转载自blog.csdn.net/ltfdsy/article/details/81384211