迭代器
- 迭代器
- 可迭代对象(iterable)
- 概念
- 实现了迭代器协议的对象(只要对象本身有__iter__方法,那它就是可迭代的)
- 可以直接作用于for循环的对象统称为可迭代对象
- 判断一个对象是否可迭代对象
- 1. isinstance()
- 使用isinstance()判断一个对象是否是Iterable对象(再用这个方法的时候一定记得调用模块)
- from collections import Iterable
- print(isinstance([],Iterable))
- # True 列表是可迭代对象
- print(isinstance({},Iterable))
- # True 字典是可迭代对象
- print(isinstance('abc',Iterable))
- # True 字符串是可迭代对象
- print(isinstance((x for x in range(10)),Iterable))
- # True 生成器是可迭代对象
- print(isinstance(100,Iterable))
- # False 数字不是可迭代对象<br><br>
- 2. 可以引用 .__iter__
- 另一种是Python内置方法中有 .__iter__ 方法,如果能引用该方法的对象都是可迭代对象(.__iter__方法调用后的执行结果就是迭代器
- 对象
- 字符串 列表 元组 字典 集合 文件句柄
- 迭代器 (Iterator)
- 概念
- 对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退)
- 判断
- from collections import Iterator
- print(isinstance((x for x in range(10)), Iterator))
- # True 生成器是迭代器
- print(isinstance([], Iterator))
- # False 列表不是迭代器
- print(isinstance({}, Iterator))
- # False 字典不是迭代器
- print(isinstance('abc', Iterator))
- # False 字符串不是迭代器<br><br>
- 对象
- 文件句柄
- 文件句柄既能被next()函数调用又能被iter()函数调用,所以文件既是迭代器,又是可迭代对象
- 事例
- while
- d={'a':1,'b':2,'c':3}
- i=d.__iter__()
- #i=iter(d)#和上面的等式一模一样 i就是迭代器
- print(i.__next__())#等同于下面
- print(next(i))#等同于上面
- print(i.__next__())
- print(i.__next__())#因为字典中的key只有3个,所以在这里会报错,因为超出了范围
- ---------------------------------------------------
- #报错内容是StopIteration,下面就一起消除这个报错吧
- d={'a':1,'b':2,'c':3}
- i=d.__iter__()#这是一个iter函数,等同于iter(d) i就是迭代器
- #i=iter(d)#和上面的等式一模一样 i就是迭代器
- while True:
- try: #try...except捕捉异常,看是否出现StopIteration这个异常,如果出现执行break,相当于一个if判断
- print(next(i))
- except StopIteration:
- break
- 列表的例子:
- l=['a','b','c','d','e']
- i=l.__iter__()
- # i=iter(i)
- while True:
- try: #try...except捕捉异常
- print(next(i))
- except StopIteration:
- break
- 文件
- f=open("a.txt","r")
- i=f.__iter__()
- while True:
- try:
- print(next(i),end="")
- except StopIteration:
- break
- for
- d={'a':1,'b':2,'c':3}
- for k in d:#for循环在这里做的事可以理解为 d=d.__iter__(),牛逼!
- print(k)
- #而且for循环自动加了next()函数,自动next下一个,牛逼!
- #而且for循环把while循环当中的try...except所做的是给做了,牛逼!
- s={1,2,3,4}#for循环列表
- for i in s:
- print(i)
- with open("a.txt","r") as f:
- for line in f:
- 两者区别
- 文件句柄既能被next()函数调用又能被iter()函数调用,所以文件既是迭代器,又是可迭代对象
- 字符串,列表,元组,字典,集合都不是迭代器,是可迭代对象
- 整形不是可迭代对象,所以更不可能是迭代器
- 迭代器
- 1.独有.__next__方法
- 2.也有.__iter__方法
- 3.迭代器.__iter__()后还是迭代器
- 可迭代对象
- 1.有.__iter__方法
- 优缺点
- 优点
- #优点
- # 1:迭代器提供了一种不依赖于索引的取值方式,这样就可以遍历那些没有索引的可迭代对象了(字典,集合,文件)
- # 2:迭代器与列表比较,迭代器是惰性计算的,更节省内存
- 缺点
- #缺点:
- # 1:无法获取迭代器的长度,使用不如列表索引取值灵活
- # 2:一次性的,只能往后取值,不能倒着取值
- 用途
- for循环