我们之前一直用可迭代的对象像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('报错啦')