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...')
  • 相关阅读:
    页面的加载过程
    free 命令
    linux chmod命令(转)
    less 命令(转)
    cat 命令(转)
    cp 命令(转)
    mv命令(转)
    rm 命令(转)
    mkdir命令
    Docker网络基础
  • 原文地址:https://www.cnblogs.com/xuewei95/p/14461004.html
Copyright © 2011-2022 走看看