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

  • 相关阅读:
    置换加密算法
    堆和优先队列的应用
    定时发送邮件小程序
    Hibernate的缓存
    Spring中使用JDBC
    Spring AOP(创建切面)
    处理不可中断阻塞
    SQL语句实例说明
    spring_声明式事务
    Flex_includeIn属性的作用
  • 原文地址:https://www.cnblogs.com/ywyin/p/9001081.html
Copyright © 2011-2022 走看看