迭代器
什么是迭代器?
迭代是一个重复的过程,每次重复即以此迭代,并且每次迭代的结果都是下一次迭代的初始值
1、为何要有初始值:
对于序列类型、字符串、列表、元组,我i们可以使用索引的方式迭代取出其包含的元素;但对于字典、集合、文件等类型的时没有索引的,若还想去除内部包含的元素,则必须找到一中不依赖索引的迭代方式,这就是迭代器
2、什么是可迭代对象:
可迭代对象指的是内置有__iter__()方法的对象,即obj.__iter__()
3、什么是迭代器对象:
可迭代对象执行 obj,.__iter__() 得到的结果就是迭代器对象,而迭代器对象指的是即内置有__iter__() 有内置有 __next__方法的对象
4、文件类型四迭代对象
open('a.txt')..__iter__()
open('a.txt').__next__()
优点:
1、提供一种统一的、不依赖于索引的迭代方式
2、惰性计算,节省内存
缺点:
1、无法获取长度(只有在 next 完毕才知道到底有几个值)
2、一次性的,只能往后走,不能往前回退
再论 for 循环
for 循环工作原理:
1、执行 in 后对象的 dic.__iter__() 方法,得到一个迭代对象 iter_dic
2、执行 next(iter_dic),将得到的值赋值给 k, 然后执行循环体代码
3、重复过程2、直到捕捉到异常 StopIteration,,结束循环
可以直接作用于 for 循环的数据类型有以下几种:
1、一类集合数据类型,如 list、tuple、dict、set、str 等
2、一类是生成器 generator,包括生成器和带 yield 的generator function
这些可以直接作用于 for 循环的对象统称为 可迭代对象, Iterabke。 可以使用 isinstance() 判断一个对象的是否是 Iterable 对象:
>>>from colllection import Iterable >>>isinstance([], Iterable) True >>>isindtance('abc', Iterable) True >>>isinstance((x for x in range(10)), Iterable) True >>>isinstance(100, Iterable) False
可以使用 next() 函数调用的并不断返回下一个值的对象称之为迭代器: Iterator
可以用isinstance() 判断一个对象是否是 Iterator 对象
>>> from collection import Iteratir >>>isinstannce((x for x in range(10)), Iterator) True >>>isinstance("abc", Iterator) False >>>isinstance([], Iterator) False
由for 循环开始,中间引申了 列表生成式、生成器、迭代器,他们之间的关系就是这样