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这个生成器才会根据你给它定义的算法进行计算,并且返回一个值。这样可以节省空间,不过这样会花费更多的时间,所以这是在用时间换空间。

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

列表表达式:

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:个人学习记录,仅供参考,如有错误请留言

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值