zoukankan      html  css  js  c++  java
  • 生成器函数的好处及总结,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...')
  • 相关阅读:
    Java实现 LeetCode 792 自定义字符串排序(暴力)
    Java实现 LeetCode 792 自定义字符串排序(暴力)
    asp.net session对象的持久化
    Java实现 LeetCode 791 自定义字符串排序(桶排序)
    Java实现 LeetCode 791 自定义字符串排序(桶排序)
    Java实现 LeetCode 791 自定义字符串排序(桶排序)
    Java实现 LeetCode 790 多米诺和托米诺平铺(递推)
    Java实现 LeetCode 790 多米诺和托米诺平铺(递推)
    Java实现 LeetCode 790 多米诺和托米诺平铺(递推)
    小白也能看懂的约瑟夫环问题
  • 原文地址:https://www.cnblogs.com/xuewei95/p/14461004.html
Copyright © 2011-2022 走看看