二、迭代器

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方法去创建一个新的迭代器对象,如果有两个或者多个循环使用同一个迭代器,必然只会有一个循环能取到值。

posted @ 2021-06-02 09:42  zzwYYYYYY  阅读(49)  评论(0)    收藏  举报