可迭代对象:内部必须有一个__iter__()方法
迭代器:可迭代对象的基础上必须有一个__next__()方法
next: 是通过实例变量不断记录每次运行推导返回值实现的,下次运行,便可基于上次返回值及推导算法,返回下一个推导值
生成器本质是一个使用了yield返回值的函数,支持使用next()函数不断返回下一个值,同时支持使用send函数向生成器发送消息
生成的这个特性,为解决为优化内存使用效率提供了途径
因为比如一个包含1万个变量的列表,和一个包含推导算法的生成器,其内存占用空间,可能前者是后者的几个数量级倍数,比如下面的
a=[i for i in range(10000)] #运行sys.getsizeof(a)后,为87616
a=(i for i in range(10000))#运行sys.getsizeof(a)后,为112,直接减少了8千倍的内存占用空间
def read_file(fpath):
BLOCK_SIZE = 1024
with open(fpath, 'rb') as f:
while True:
block = f.read(BLOCK_SIZE) #第一次block指向是一个不可变对象
if block:
yield block #再次循环block是指向另一个不可变对象
else: #第一个不可变对象 由于引用的次数为0 就被删除啦,
return #所以省空间
详细请看:
python之迭代器和生成器全解--包含实现原理及应用场景_一秋闲谈的博客-CSDN博客_python迭代器的应用场景