Python中的生成器

Python中的生成器就像是一个有‘按钮’的工具,你点一下‘按钮’它就给你一个反应。并且它还是‘一次性的’,这里的一次性是指它只能遍历一次,也就是这个工具的按钮只能按有限次。当然按了n次之后不是说它不能用了。话不多说上代码:

首先定义一个产生斐波那契数列的生成器:

def fib(max):
    n,a,b=0,0,1
    while n<max:
         yield b
         a,b=b,a+b
         n=n+1

将生成器赋值给一个变量a:

a = fib(6)

通过a.next()来点击生成器的‘按钮’:

a.next()

当生成器的按钮的被按的次数大于有限次时,它就会报一个StopIteration(停止迭代)的异常告诉你这个生成器已经不能用了

看图


此时我们可以通过a=fib(6),生成一个新的生成器

说了这么多,生成器到底有什么好处呢?我们前面说了生成器只有你按一下它才给你反应,这里的意思就是你通过调用a.next(),a这个生成器才会根据你给它定义的算法进行计算,并且返回一个值。这样可以节省空间,不过这样会花费更多的时间,所以这是在用时间换空间。

说起生成器就不得不提起列表表达式和函数,因为它们之中有很多相似之处,和不同之处。我们通过类比记忆,就可以更加容易的记住它们。

列表表达式:

扫描二维码关注公众号,回复: 1464205 查看本文章
L=[x*x for x in range(10)]

这是产生一个0到9的平方的列表


生成器表达式:

G = (x*x for x in range(10)) 

这是生成一个0到9的平方的生成器的表达式


区别:直观上看就是一个是[],一个是(),一个返回的是列表list,一个返回的是生成器generator

这里要说一下,我们可以用for循环去自动迭代生成器,而不止是调用它的next()方法去一个一个地迭代


而生成器与函数的区别在于,用于返回的语句不同,函数用的return,生成器用的yield

用函数来实现斐波那契数列:

def fib(max):
    n,a,b=0,0,1
    while n<max:
         print b
         a,b=b,a+b
         n=n+1

运行结果:


可以看到我们调用fib(6)时,程序直接将所有结果输出,这与生成器的‘按一下’返回一个值是有区别的。

总结:

生成器有两大特点‘一次性’和‘健忘性’,这在处理大量数据时有着很重要的作用,例如处理我们处理一个文本文件,就可以一行一行地处理,处理完一行‘忘掉’一行。而不是把整个文件都读取到内存从而占用大量的内存。

参考资料:

生成器-廖雪峰的官方网站

python生成器到底有什么优点?(知乎)

PS:个人学习记录,仅供参考,如有错误请留言

猜你喜欢

转载自blog.csdn.net/u011648373/article/details/80078997