1 迭代
迭代就是重复做一件事,并且执行时依赖于上一次执行的结果
2 什么是迭代器协议
- 迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退)
- 可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法)
- 协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。
3 迭代器
通常情况下,如list和tuple这类容器,是以序列存储的,存在索引(下标),可以通过索引来遍历。但有一些不存在索引,如无序的set和dict,文件。那我们就该如何遍历。这就需要迭代器了。
迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素(且不依赖索引),每个迭代器对象代表容器中的确定的地址。
迭代器描述的是一个重复的概念。
迭代器的作用:
- 不通过索引将对象里的内容取出来;
- 迭代器就是一个内存地址,next()一次取一个值,同一时刻只有一个值,是惰性计算,更省内存。
缺点:
- 无法获取迭代器的长度,使用不如列表灵活。
- 迭代器是一次性的,只能向后取值。
4 Python中的循环
对象实现了迭代器协议,就能用for循环所有对象。
换句话就是,能被for遍历的都是可迭代对象。
for循环的本质是:调用可迭代对象的__iter__()方法,将可迭代对象变成迭代器,再每一次循环调用对象的__next__()方法,直到遇到StopIteration,并捕捉该异常。结束for循环。
4.1 先看看不用for,用while遍历迭代是什么怎样的
只要对象本身有__iter__(),就是可迭代的对象。
dic={"a":1,"b":"2","c":3,"d":4}
i=dic.__iter__() #等同于i=iter(dic)
dic.__iter__()返回值i是一个迭代器。
只要是迭代器,都有一个__next__()方法,来返回下一个值,直到遇到StopIteration。
i.__next__() #等价于next(i) dic={"a":1,"b":"2","c":3,"d":4} i=dic.__iter__() while True: try: print(next(i)) except StopIteration: break result: a b c d
4.2 python中提供了一个更强大的功能for。
dic={"a":1,"b":"2","c":3,"d":4} i=dic.__iter__() for x in i: print(x) result: a b c d
等同于上面的while循环
dic={"a":1,"b":"2","c":3,"d":4} for x in dic: print(x) result: a b c d
打印的和上面结果一样,也就是说for变量的对象可以是迭代器,也可以是可迭代的对象。for会将要遍历的对象先调用dic=dic.__iter__()转换成迭代器,再遍历出来。
总结:能被for遍历的都是可迭代的对象。
注意:
dic={"a":1,"b":"2","c":3,"d":4} for x in dic: print(x) for x in dic: print(x) result: a b c d
第二次for循环并没有打印,所以说迭代器是一次性的,打印完了就没值了。
5 判断一个对象是否是迭代器或可迭代的对象
需要用到collections模块中的Iterable、Iterator。
from collections import Iterable,Iterator dic={"a":1,"b":"2","c":3,"d":4} i=dic.__iter__() print(isinstance("aaa",Iterable)) print(isinstance("aaa",Iterator)) print("------") print(isinstance(dic,Iterable)) print(isinstance(dic,Iterator)) print("------") print(isinstance(i,Iterable)) print(isinstance(i,Iterator)) result: True False ------ True False ------ True True