迭代器&生成器
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