一个简单的生成器函数
import time def test(): print('开始生成器') time.sleep(2) print('开始生成第1个。') yield '生成了第1个' time.sleep(3) print('开始生成第2个。。') yield '生成了第2个' time.sleep(3) print('开始生成第3个。。。') yield '生成了第3个' res=test() print(res) print(res.__next__()) print(res.__next__()) print(res.__next__())
生成器函数的好处:
1、节省内存,特别是大量数据的时候。比如我们生成一个列表:mylist = [1, 2, 3],也可以是mylist = [x**2 for x in range(3)],但是这样程序运行的时候,列表的数据全部存储在内存中,当数据量特别大的时候,会特别消耗内存。但是,利用生成器我们可以这样gen = (x ** 2 for x in range(4)),生成器只有在用的时候会生成,所以,当我们没有用到这个列表的时候它就不会存在,也不会占内存。
如果有人不信可以试试这这两段代码:
2、 节省代码,减少代码量同时提高代码可读性。请看下面两个函数,他们实现的功能是相同的,但是利用生成器代码量就会减少。
3、 模拟并发。Python虽然支持多线程,但是由于GIL(全局解释锁,Global Interpreter Lock)的存在,同一个时间,只能有一个线程在运行,所以无法实现真正的并发。这时就出现了协程。复杂解释不说了,简单说协程就是你可以暂停执行的函数"。也就是yield。
Python实现协程最简单的方法,就是使用yield。当一个函数在执行过程中被阻塞时,就用yield挂起,然后执行另一个函数。当阻塞结束后,可以用next()或者send()唤醒。相比多线程,协程的好处是它在一个线程内执行,避免线程之间切换带来的额外开销,而且协程不存在加锁的步骤。
下面是一个生产者与消费者例子:
通过执行结果,我们会看到控制台交替打印出生产和消费的结果。消费者consumer()函数是一个生成器函数,每次执行到yield时即挂起,并返回上一次的结果给生产者。生产者producer()接收到生成器的返回,并生成一个新的值,通过send()方法发送给消费者。至此,我们成功实现了一个(伪)并发。
码字不易,多多关注,谢谢。不足之处欢迎指正。