zoukankan      html  css  js  c++  java
  • Generator和Iterator

    #列表生成式
    print([i*2 for i in range(10)])

    通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

    所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

    #生成器只有在调用时才会生成相应的数据

    #只有一个方法 __next__(),只记得当前的位置

    #利用函数做生成器
    def fib(max):
        n,a,b = 0,0,1
        while n<max:
            yield b
            a,b = b,a+b
            n =n+1
          #  return 1
    
    f= fib(10)
    g = fib(8)
    while True:
        try:
            x = next(g)
            print("g:",x)
        except StopIteration as e:
            print("Generator return Value:",e.value)
            break
    利用函数做生成器

    #__next__()  #唤醒

    #send(值)#唤醒之后传值

    #单线程下的并行任务案例
    import time
    def consumer(name):
        print("%s 准备做咖啡啦!" %name)
        while True:
           cof = yield #没有返回值为空
    
           print("咖啡[%s]来了,被[%s]喝了!" %(cof,name))
    
    
    c = consumer("yyw")
    c.__next__()  #next只是唤醒
    b1 ="拿铁"
    c.send(b1)  #send可以给yield传值
    b2 ="曼特宁"
    c.send(b2)
    b3 ="已经唤醒"
    c.send(b3)
    
    
    def producer(name):
        c = consumer('A')
        c2 = consumer('B')
        c.__next__()
        c2.__next__()
        print("老子开始准备做咖啡啦!")
        for i in range(10):
            time.sleep(1)
            print("做了2杯咖啡!")
            c.send(i)   #send可以给yield传值
            c2.send(i)
    
    producer("yyw")
    单线程下的并行任务案例

    ### 迭代器 ###

    可以被next()函数调用并且不断返回下一个值得对象叫迭代器

    生成器肯定是迭代器!

    #可迭代对象

    1) list,tuple,dict,set,str

    2)generator

    isinstance([], Iterable]

    通过Iter()函数把list,dict,str等Iterable变成Iterator

  • 相关阅读:
    二分+RMQ/双端队列/尺取法 HDOJ 5289 Assignment
    思维题 HDOJ 5288 OO’s Sequence
    树形DP Codeforces Round #135 (Div. 2) D. Choosing Capital for Treeland
    最大流增广路(KM算法) HDOJ 1853 Cyclic Tour
    最大流增广路(KM算法) HDOJ 1533 Going Home
    最大流增广路(KM算法) HDOJ 2255 奔小康赚大钱
    Complete the Word CodeForces
    Gadgets for dollars and pounds CodeForces
    Vasya and Basketball CodeForces
    Carries SCU
  • 原文地址:https://www.cnblogs.com/ywyin/p/9001081.html
Copyright © 2011-2022 走看看