zoukankan      html  css  js  c++  java
  • 迭代器与生成器

    迭代器

    迭代器是访问集合元素的一种方式。迭代器从集合的第一个元素开始访问,直到所有的元素被访问完结束。

    迭代器的特点:

    1.访问者不需要关心迭代器内部结构,只需要通过__next__方法去取下一个内容

    2.不能直接访问集合中间的某个值,只能从头访问到尾

    3.访问到一半时不能回退

    4.适合访问比较大的数据结合,节省内存

    li = iter(['aa','bb','cc'])  #生成一个迭代器
    
    print(type(li))  
    #<class 'list_iterator'>
    print(li.__next__())  #获取下一个值
    #aa
    print(li.__next__())
    #bb
    print(li.__next__())
    #cc

    生成器

    一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器。

    yield:使函数中断,并保存中断状态,中断后可以继续执行其他代码,可以重新执行这个函数,从上一次yield语法下一句开始执行

    ef money(qian):
        while qian >0:
            qian -= 100
            yield 100
            print('又来取钱了,败家子!!!')
    
    atm = money(500)
    print(atm.__next__())
    print(atm.__next__())
    print('来个大保健')
    print(atm.__next__())
    print(atm.__next__())
    print(atm.__next__())
    #输出结果
    100
    又来取钱了,败家子!!!
    100
    来个大保健
    又来取钱了,败家子!!!
    100
    又来取钱了,败家子!!!
    100
    又来取钱了,败家子!!!
    100

    yield异步

    在单线程的情况下实现并发运算

     1 import time
     2 def consumer(name):
     3     print('%s 准备吃包子了'%name)
     4     while True:
     5         baozi = yield  #接收值i
     6         print('包子[%s]来了,被[%s]吃了' %(baozi,name))
     7 
     8 def shengchan(name):
     9     c = consumer("A")
    10     c2 = consumer("B")
    11     c.__next__()
    12     c2.__next__()
    13     print('%s开始做包子了'%name)
    14     for i in range(10):
    15         time.sleep(1) #过了一秒钟
    16         print('%s做了两个包子'%name)
    17         c.send(i)
    18         c2.send(i)
    19 
    20 shengchan('yoyo')
  • 相关阅读:
    HDU1316 fib+高精度
    HDU1868
    HDU2586 LCA
    HDU1113 字符串处理
    HDU1115 几何+多边形重心
    HDU1124
    HDU1110 几何
    HDU1103
    HDU2670 DP
    linux 下查看机器是cpu是几核的
  • 原文地址:https://www.cnblogs.com/yoyovip/p/5646360.html
Copyright © 2011-2022 走看看