python生成器和迭代器

生成器:

通过列表生成式,我们可以直接创建一个列表,但是,收到内存限制,列表容量肯定是有限的,而且,创建一个包含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()函数获得一个迭代器对象。

原文地址:https://www.cnblogs.com/caibao666/p/6394504.html