迭代器&生成器

1、迭代器:

可迭代对象 

#  如何判断一个对象是不是可迭代对象
# 方法一:isinstance(obj,Iterable)
# 方法二:看有没有__iter__方法

迭代器协议:

#1、迭代器类型必须包含 __iter__和__next__
#2、__iter__方法必须返回 self
#3、__next__必须返回下一个值,没有则抛出 StopIterator 异常
#4、对迭代器执行for循环 每次都会执行__next__方法
#5、迭代器只能迭代一次 不能重复 迭代中每次都是一个新的数据 占用内存少
#6、for语句会忽略StopIterator异常
class Next():
    def __init__(self,stop,start=0):
        self.start = 0
        self.stop = stop

    def __iter__(self):
        return  self

    def __next__(self):
        """
        返回下一个数
        :return: 如果有返回下一个数,没有就抛出 StopIteration异常
        """
        if self.start>=self.stop-1:
            raise StopIteration
        else:
            self.start += 1
            return self.start


if __name__ == '__main__':
    obj = Next(5)
    for i in obj:
        print(i)

    # print(obj.__next__())
    # print(obj.__next__())
    # print(obj.__next__())
    # print(obj.__next__())
    # print(obj.__next__())

  

如何判断:

#1、过isinstance(obj,Iterator)
#2、看对象有没有 __iter__属性 __next__属性
from  typing import Iterator
obj = iter(range(1,2))
print(isinstance([1,2,3],list))      #True
print(isinstance(obj,Iterator))      #True
print(isinstance([1,2,3],Iterator))  #False

"""
list和 可迭代对象区别
"""
# for attr in dir(list):
#     print(attr)   #__next__

for attr in dir(obj):
    print(attr)   #__next__    还有__iter__

生成器

为了快速方便创建一个迭代器

yield 实现快速创建迭代器,也就是 一个函数中有yield关键字,调用函数的时候不会执行函数的内容,会返回一个对象(这个对象类型是生成器类)

当要访问生成器的__next__方法时,函数会编程running状态,当执行完yield时,函数变成非running状态(即挂起),

只有再次执行生成器对象的__next__方法时函数才会被唤醒。

一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己的内置的__iter__方法),所以生成器就是可迭代对象

实现生成器的两种方法

1、直接通过函数中添加yield

def squares(start, stop):  # 第二种
    for i in range(start, stop + 1):
        yield i * i
squares(1,2)
# <class 'generator'>

2、通过推导式

squares2 = (i * i for i in range(1, 4))
# <class 'generator'>

都是返回生成器类

生成器执行顺序:

# 当要访问生成器的__next__方法时,函数会编程running状态,当执行完yield时,函数变成非running状态(即挂起),

 

 

 

参考博客:https://blog.csdn.net/bandaoyu/article/details/88254937

posted @ 2021-03-02 23:02  强小白  阅读(92)  评论(0编辑  收藏  举报