zoukankan      html  css  js  c++  java
  • 生成器的妙用

    这里面说生成器最大的好处是可以省内存空间。

    因为生成器generator,是一个一个生成数据的。在生成的过程中,你可以进可以出,可以做点别的事情。哈哈~~~

    上代码:这里要插一个叫做列表生成式的东西,就是一句话写出一个列表。

    这个就是最简单的列表生成式,稍微改动一下,它就变成了生成器。

    看到吗,唯一的区别就是列表生成式是中括号,生成器是圆括号。

    稍微复杂一点的生成器可以用函数来表示,例如斐波那契数列。

    # __*__ coding: utf-8 __*__
    __author__ = "David.z"
    def fib(max):
        n,a,b=0,0,1
        while n < max:
            yield b
            a,b = b, a+b
            n = n+1
        return 'done'
    print(type(fib(10)))
    print(fib(10))
    f = fib(10)
    print(f.__next__())
    print(f.__next__())
    print("==========")
    print(f.__next__())
    print(f.__next__())
    print(f.__next__())
    print("Start Top".center(20,"*"))
    for i in f:
        print(i)

    这样就实现了可进可出,还有更牛逼的。

    例如吃包子。

    def consumer(name):
        print("%s 准备吃包子了!"%name)
        while True:
            baozi = yield
            print("包子[%s]来了,被[%s]吃了!"%(baozi,name))
    c = consumer("david.z")
    c.__next__()
    b1="红豆馅"
    c.send(b1)
    c.__next__()

    这里引用了一个send命令,可以把做好的包子馅放入到生成器里面。

    最后,实现一个单线程实现多并发的效果。也使用生成器,实际上就是生成器一步一步的出来。

    import time
    def consumer(name):
        print("%s 准备吃包子了!"%name)
        while True:
            baozi = yield
            print("包子[%s]来了,被[%s]吃了!"%(baozi,name))
    c = consumer("david.z")
    c.__next__()
    b1="红豆馅"
    c.send(b1)
    c.__next__()
    
    
    def producer(name):
        c = consumer("A")
        c2 = consumer("B")
        c.__next__()
        c2.__next__()
        print("老子开始准备做包子了!")
        for i in range(10):
            time.sleep(1)
            print("做了1个包子,分两半!")
            c.send(i)
            c2.send(i)
    producer("Alex")
     
  • 相关阅读:
    Add Two Numbers
    Reverse Linked List II
    Reverse Linked List
    Remove Duplicates from Sorted List
    Remove Duplicates from Sorted List II
    Partition List
    Intersection of Two Linked Lists
    4Sum
    3Sum
    2Sum
  • 原文地址:https://www.cnblogs.com/davidz/p/9744863.html
Copyright © 2011-2022 走看看