python之生成器
生成器
我们知道如果我们要循环输出一个列表的时候,一般情况下,在我们输出它们之前,列表里面的元素已经准备就绪了,这也就意味着,在内存中这些元素已经存在。那么问题来了,如果我们的这个列表内容很多,我们的内存可能需要很多的空间来存放这些元素,从成本角度来说,这显然是不划算的。这时候我们的主人公生成器就有话要说了,节省成本哪家强,当然找我生成器。
那么我们的生成器的性质是咋样的呢?Let me tell you!
生成器有一种即取即用的性质,就是你需要多少你可以通过一定的方法从里面取多少,这时候内存里面就没有那些准备就绪的元素了,相比之下是不是节约了成本呢?
So , talk is cheap,I will show you my code
First ,How can we creat generator?
We have two ways:
1.通过列表生成式
a = ( i for i in range(1000))
这里,我们的 a 就是一个生成器了
2.通过函数(by function)
def range2(n): '''生成器''' count = 0 while count < n: print("before",count) count += 1 yield count return 'done'
在函数中,只要我们有了yield之后,我们的函数便变成了生成器,是不是很神奇--
yield
在上面我们使用函数生成了生成器之后,我们用到了一个叫yield的家伙,这家伙是干什么的呢?
yield有两个作用:
1.返回数据
2.将函数冻结在这里,等待唤醒
那么我们如何去唤醒yield呢,我们也有两种方法:
1.利用next()
s = range2(3) print(next(s))
这里需要注意的是,我们每调用一次,生成器就产出一个。这种情况下,我们的生成器就可以从里面向外面一个一个传数据出来了
2.send方法
s.send("stop")#唤醒yield并且能向里面传值
通过send方法,我们可以向yield传一个值,然后继续唤醒它。但是在这里,我们在没有激活它之前,是不能用send的(暂时不确定)
两者的共同点:都会激活yield,并且运行,直到碰到下一个yield
补充几点:
函数有了yield之后之后,函数名加()就变成了一个生成器
在生成器中,return代表中止,直接会报错,其中报错会有return的值