迭代器

我们之前一直用可迭代的对象像list/dict/tuplew/set到底什么是可迭代对象,什么是迭代器!

可迭代协议-------只要含有"__iter__"方法的数据类型都是可迭代的

迭代器协议-----含有"__next__"和"__iter__"方法的变量/值都是迭代器

__length_hint__ 表示迭代器中有多少元素

__setstate__ 控制迭代器从第几个迭代

__next__ 从迭代器中取下一个值

可迭代的怎么变成迭代器:

   可迭代变量.__iter__

l=[1,2,3,4]
l_iter=l.__iter__()  #获取迭代器
print(l_iter.__next__())   获取一个值 1
print(l_iter.__next__())  获取值2
print(l_iter.__next__())  获取值3
print(l_iter.__next__())  获取值4
print(l_iter.__next__())   StopIteration   没有值可以取 一旦出现StopIteration不会报错,直接执行break

 ##在迭代器中值取一次就没有了 

迭代器的特点:节省内存,惰性运算,一次性取值

  具有next和iter方法

  通过一个next多次执行就可以获得所有这个容器中的值

  迭代器的值只能取一次

  不取值的时候,值不会出现

检查变量是不是不可迭代的

第一种:

  print("__iter__" in dir[])

dir([]) 内置函数  查看一个数据类型内部有哪些方法

两边带有下划线的方法叫"魔术方法","双下方法","内置方法"

整数内部是不含有"__iter__"的方法

第二种:

  from collections improt Iterable

  print(isinstance({},Iterable))

内置函数,判断一个具体的值是不是可迭代的,如果可以返回Turn,如果不可迭代返回False

for循环值:内部的机制就是迭代器取值的机制

  在for循环执行的过程中:先把可迭代的变成一个迭代器,然后在从中一个一个的取值

  range生成的就是一个迭代器,创建这个迭代器并不会真的把迭代器中的所有数据一次性生成

什么时候生成呢?

  只有通过next取值的时候才会生成

  迭代器的作用就是节省内存,for循环就是利用迭代器节省内存的特点来对python当中的变量来进行操作的

for循环的本质:

  1.生成迭代器

  2.循环每一次对这个迭代器执行next

  3.并且到迭代器最后停止

for循环和可迭代的关系:

  迭代器都是可迭代的

  迭代器是特殊的存在

for循环和迭代器的关系:

  无论是可迭代的还是迭代器都可以被for循环

  如果直接循环迭代器,那么就循环一次

  如果循环非迭代器,那么每次循环都是从头开始

用while循环实现for循环
l = [1,2,3,5,6,7,12,23,412]
l_iter = l.__iter__()
while True:
    try:   # 要保护的代码
        print(l_iter.__next__())
    except StopIteration:  # 要保护的代码中一旦出现了StopIteration错误,程序不报错,直接执行break
        print('报错啦')

  

原文地址:https://www.cnblogs.com/lilei1996/p/9917559.html