二、迭代器
1、迭代器
迭代器即用来迭代取值的工具,而迭代是重复反馈过程的活动,其目的通常是为了逼近所需的目标或结果,每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值,单纯的重复并不是迭代
from collections.abc import Iterable
#引入可迭代对象
class Zzw():
def __init__(self,x):
self.x = x
def __iter__(self):
pass
#普通的类与可迭代对象之间的区别就在于是否重写__iter__方法
d = Zzw(100)
print(isinstance(d,Iterable))
#判断该实例化对象是否是可迭代对象
#True
for x in d:
print(x)
#TypeError: iter() returned non-iterator of type 'NoneType'
1. for...in 循环的本质就是调用可迭代对象的 __iter__ 方法,获取这个方法的返回值
2. 这个返回值需要是一个迭代器对象,然后再不停调用这个迭代器对象的 __next__ 方法
class Foo():
def __next__(self):
return 3
class Zzw():
def __iter__(self):
return Foo()
Z = Zzw()
for x in Z:
print(x,end = ' ')
#3 3 3 3 3 ...
class Zzw():
def __iter__(self):
return self
def __next__(self):
#每一次for...in都会调用一次__next__方法,获取__next__方法的返回值,如果不设置停止迭代器的操作,那么将会无限执行此轮回
return 'hello'
1.1 停止迭代器
class Zzw():
def __init__(self,x):
self.x = x
self.y = 0
def __iter__(self):
return self
def __next__(self):
self.y += 1
if self.y <= self.x:
return 'hello'
else:
raise StopIteration
#手动抛出迭代器停止异常,来停止迭代器
for x in Zzw(10):
print(x,end = ' ')
#hello hello hello hello hello hello hello hello hello hello
1.2 迭代器的优缺点
基于索引的迭代取值,所有迭代的状态都保存在了索引中,而基于迭代器实现迭代的方式不再需要索引,所有迭代的状态就保存在迭代器中,然而这种处理方式优点与缺点并存:
1.2.1 优点
1、为序列和非序列类型提供了一种统一的迭代取值方式。
2、惰性计算:迭代器对象表示的是一个数据流,可以只在需要时才去调用next来计算出一个值,就迭代器本身来说,同一时刻在内存中只有一个值,因而可以存放无限大的数据流,而对于其他容器类型,如列表,需要把所有的元素都存放于内存中,受内存大小的限制,可以存放的值的个数是有限的。
1.2.2 缺点
1、除非取尽,否则无法获取迭代器的长度
2、只能取下一个值,不能回到开始,更像是‘一次性的’,迭代器产生后的唯一目标就是重复执行next方法直到值取尽,否则就会停留在某个位置,等待下一次调用next;若是要再次迭代同个对象,你只能重新调用iter方法去创建一个新的迭代器对象,如果有两个或者多个循环使用同一个迭代器,必然只会有一个循环能取到值。

浙公网安备 33010602011771号