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)时,程序直接将所有结果输出,这与生成器的‘按一下’返回一个值是有区别的。
总结:
生成器有两大特点‘一次性’和‘健忘性’,这在处理大量数据时有着很重要的作用,例如处理我们处理一个文本文件,就可以一行一行地处理,处理完一行‘忘掉’一行。而不是把整个文件都读取到内存从而占用大量的内存。
参考资料:
PS:个人学习记录,仅供参考,如有错误请留言