Python基础之迭代器
一.什么是迭代器
迭代器是用来迭代取值的工具。
而涉及到把多个值循环取出来的类型有:列表,字符串,元组,字段,集合,打开文件等。通过使用的遍历方式有for···in···,while等,但是,这些方式只适用于有索引的数据类型。为了解决索引取的局限性,python提供了一种 不依赖于索引的取值方式:迭代器
注意:迭代是通过重复执行的代码处理相似的数据集的过程 并且本次迭代的处理数据要依赖上一次的结果继续往下做 上一次产生的结果为下一次产生的结果的初始状态 如果中途有任何停顿,都不能算是迭代。
二.可迭代对象
可迭代对象:但凡内置有__iter__方法的都称为可迭代对象
常见的可迭代对象:
1.集合数据类型,如list,tuple,dict,set,str等
2.生成器,包括生成器和带yield的生成器函数。
三.如何创建迭代器 """ __iter__() 该方法返回一个迭代器,此处可以返回自己 __next__() 该方法返回下一个迭代器对象 """ class MyNums: def __iter__(self): self.num = 1 return self def __next__(self): self.num += 1 return self.num mynums = MyNums() myiter = iter(mynums) # 通过可迭代对象mynums来生成迭代器 print(next(myiter)) print(next(myiter)) print(next(myiter)) print(next(myiter))
迭代器是一个包含数个值的对象。
迭代器是可以迭代的对象,这意味着您可以遍历所有值。
从技术上讲,在Python中,迭代器是实现迭代器协议的对象,该协议由方法 __iter__() 和 __next__() 组成。
简而言之,一个类里面实现了__iter__()和__next__()这两个魔法方法,那么这个类的对象就是可迭代对象。
四.迭代器的优缺点
1.优点节约内存不依赖索引取值实现惰性计算
2.缺点无法获取长度(只有在next完毕才知道到底有几个值) 一次性的,只能往后走,不能往前退
五.迭代器示例 class Stu: def __init__(self): self.students = [] def __iter__(self): return self def add(self): name = input("请输入姓名:") tel = input("请输入电话:") addr = input("请输入地址:") new_stu = dict() new_stu["name"] = name new_stu["tel"] = tel new_stu["addr"] = addr self.students.append(new_stu) def __next__(self): return self.students s = Stu() #创建可迭代的对象 s.add() s.add() s.add() ss=iter(s) #由可迭代对象生成迭代器 print(next(ss))
另外,如果类Stu继承了Iterator,那么Stu可以不用实现__iter__()方法from collections.abc import Iterable, Iterator class Stu(Iterator): def __init__(self): self.students = [] # def __iter__(self): # return self def add(self): name = input("请输入姓名:") tel = input("请输入电话:") addr = input("请输入地址:") new_stu = dict() new_stu["name"] = name new_stu["tel"] = tel new_stu["addr"] = addr self.students.append(new_stu) def __next__(self): return self.students # 创建对象 s = Stu() # Iterable可以判断一个对象是否是可迭代的对象 print(isinstance(s, Iterable)) s.add() s.add() s.add() ss = iter(s) print(next(ss))
遍历迭代器
StopIteration
如果你有足够的 next() 语句,或者在 for 循环中使用,则上面的例子将永远进行下去。
为了防止迭代永远进行,我们可以使用 StopIteration 语句。
在 __next__() 方法中,如果迭代完成指定的次数,我们可以添加一个终止条件来引发错误 class MyNums: def __init__(self): self.num = 1 def __iter__(self): return self def __next__(self): if self.num <= 10: self.num += 1 return self.num else: raise StopIteration #防止无穷迭代 mynum=MyNums() myiter=iter(mynum) for i in myiter: print(i)