'''生成器函数的好处''' # def test(): # for i in range(1, 101): # print('开始做第%s屉包子' % i) # yield ('第%s屉包子做好了' % i) #运行一次函数到这里就结束且返回一个值,再运行函数执行yield下面的代码及循环,保留着函数运行状态 # print('开始卖第%s屉包子' % i) # n = test() # print(n) # print(n.__next__()) # print(n.__next__()) ''' 生成器总结 生成器函数总结: 1.语法上和函数类似:生成器函数和常规函数几乎是一样的。它们都是使用def语句进行定义,差别在于,生成器使用yield语句返回一个值,而常规函数使用return语句返回一个值 2.自动实现迭代器协议:对于生成器,python会自动实现迭代器协议,以便应用到迭代背景中(如for循环,sum函数)。由于生成器自动实现了迭代器协议,所以,我们可以调用它的next方法,并且,在没有值可以返回的时候,生成器自动产生Stopiteration异常 3.状态挂起:生成器使用yield语句返回一个值。yield语句挂起该生成器函数的状态,保留足够的信息,以便之后从它离开的地方继续执行 优点一:生成器的好处是延迟计算,一次返回一个结果。也就是说,他不会一次生成所有的结果,这对于大量数据处理,将会非常有用 优点二:生成器还能有效提高代码可读性 *****注意事项:生成器只能遍历一次(遍历一次后就不能再遍历了,会报错)***** ''' '''生产者消费者模型''' # def producer(): # ret = [] # for i in range(1, 10001): # ret.append('第%s个包子' % i) # return ret # # def consumer(l1): # for index, baozi in enumerate(l1, start=1): # print('第%s人吃了%s' % (index, baozi)) # # res = producer() # consumer(res) # def producer(): # for i in range(1, 10001): # yield ('第%s个人吃了第%s个包子' % (i, i)) # # def consumer(): # return producer() # # res = consumer() # print(next(res)) import time def consumer(name): '''消费者,只负责消费''' print('我是%s,我准备开始吃包子了' % name) while True: baozi = yield time.sleep(1) print('%s很开心的把%s给吃掉了' % (name, baozi)) def producer(): '''生产者,只负责生产''' c1 = consumer('alex') c2 = consumer('wupeiqi') c1.__next__() c2.__next__() for i in range(10): time.sleep(1) c1.send('第%s个肉包子' % i) c2.send('第%s个香菇包子' % i) # 两个功能独立存在,由send触发另一个函数运行,相当于A程序跳到B程序,B程序运行完又跳到A程序;这就叫并发(同时运行两个程序,两个程序之间彼此互不干扰,单线程并发),用一个程序模拟了一个并发的效果 producer() '''send()触发生成器函数运行''' # def test(): # print('第一次打印') # first = yield 1 # yield可以通过send进行传值,再赋值给一个变量;send的传值是传给所停留位置的yield,然后再执行生成器直到下一个yield为止 # print('第二次打印', first) # yield 2 # print('结束打印') # t = test() # x = next(t) # print(x) # y = t.send('第一次赋值') # print(y)