生成器函数的好处及总结,send()第三种触发生成器函数方法,生产者消费者模型

'''生成器函数的好处'''
# 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)
while True: print('studying...')
原文地址:https://www.cnblogs.com/xuewei95/p/14461004.html