生成器:
通过列表生成式,我们可以直接创建一个列表,但是,收到内存限制,列表容量肯定是有限的,而且,创建一个包含100万个元素的列表,不仅占用大量的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间就白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断地推算出后续的元素呢,这样就不必创建完整的list,从而节省大量的空间,在python中,这种一边循环一边计算的机制,成为生成器:generator
生成器只有在调用时才会生成相应的数据,生成器只有一个next方法,我们创建了一个generator后,基本上永远不会调用next方法,而是通过for循环来迭代它,并且不需要关心StopIteration的错误。
def fib(max): n,a,b=0,0,1 while n < max: print(b) a,b=b,a+b n+=1 return 'done' fib(10)
以上为一个生成斐波那契数列的函数,但不是生成器只需将print改为yield就成为生成器。
这样就是一个生成器了,可以用变量如f=fib(10),调用的时候
迭代器:
我们已经知道,可以直接作用于for循环的数据类型有以下几种:
一类是集合数据类型,如list、tuple、dict、set、str等;
一类是generator,包括生成器和带yield的generator function。
可以使用isinstance()判断一个对象是否是Iterable对象。
而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。
*可以被next()函数调用并不断返回下一个值的对象成为迭代器:Iterator。
可以使用isinstance()判断是否为一个
小结:
凡是可作用于for循环的对象都是可迭代类型;
凡事可作用于next()函数的对象都是迭代器对象,它们表示一个惰性计算的序列;
集合数据类型如list、dict、str等是可迭代的但不是迭代器,不过可以通过iter()函数获得一个迭代器对象。