一直弄不清楚python的迭代器和生成器用来解决的具体实际情况是什么,所以今天花一点时间来说明,python的迭代器和生成器。

生成器

通常情况下,利用列表生成式,直接创建一个列表。但是由于内存限制,列表的容量有限,同时,创建一个数量大的列表,不仅浪费存储空间,如果仅访问前端几个元素,那后边的大量元素占用的存储空间被浪费。所以,如果列表中的元素可以通过某种算法计算,那么就可以在使用时,将元素通过计算得出,减少存储空间的使用,不创建大量的存储空间,在python中一边计算以便循环的机制,称为生成器:generator。

def Fabanacci(num):
    n,a,b=0,0,1
    while n < num:
        print b
        a,b=b,a+b
        n=n+1
    return 'done'

a=Fabanacci(10)

例如Fabanacci数列,就可以将三项后的生成项变成generator,否则如果计算较大的Fabanacci数列时,浪费存储的内存空间。所以可以将后边的项变成生成器,存储一个算法,随时使用。

通过利用yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:

最难理解的是generator和函数执行流程不一样,函数是顺序执行,遇到return语句或者最后一行函数语句返回,而变成generator函数,每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处执行。

迭代器

在python中可以直接用于for循环的数据类型有以下几种:一类是集合数据类型。如list、tuple、dict、set、str等,一类是generator,其中包括生成器和带yield的generator function,这些可以直接作用于for循环的对象统称为可迭带对象:Iterable对象

迭代器和生成器区别

迭代器(iterator)是一个实现了迭代器协议的对象,python的内置数据类型可以通过for进行迭代,可以自己创建容器,实现迭代器协议,通过for、next方法迭代,在迭代末尾,会引发stopIteration异常。

生成器(generator)通过yield语句快速生成迭代器,不用iter和next方法。yield可以将一个普通函数编程生成器,并且相应的next时会从上次暂停的地方继续开始执行。生成器自身构成一个迭代器,每次迭代时使用一个yield返回值,一个生成器中可以有多个yield值。

赞 赏
真诚赞赏 手有余香
用微信请lyton喝杯咖啡?

微信支付

用支付宝请lyton喝杯咖啡?

支付宝