美文网首页
python——生成器

python——生成器

作者: Jalynn葸 | 来源:发表于2018-05-09 17:33 被阅读67次
    什么是生成器

    不想用一下方法生成大量的数据,而是用算法先占用,在用时再取

    a = [x*2 for x in range(10)]
    >>> a
    [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    
    创建生成器的方法1
    >>> b = (x*2 for x in range(10))
    >>> b
    <generator object <genexpr> at 0x102a4df68>
    >>> next(b)
    0
    >>> next(b)
    2
    >>> next(b)
    4
    

    它虽然会占用内存,但是不会能占用的空间远远小于直接生成数据的内存,如果再最后一个生成完再让它生成则会出现异常

    创建生成器的方法2

    斐波拉契数列:除了前两个,后面的一个都是前两个数之和
    在python里交换a,b
    a,b = b,a

    def craetNum():
        print("start----------")
        a,b = 0,1
        for i in range(10):
            print("-----------1-------")
            yield b
            print("----2------")
            a,b = b,a+b
            print("-----3------")
        print("---stop------")
    
    a = craetNum()
    for num in a:
        print(num)
    运行结果:
    start----------
    -----------1-------
    1
    ----2------
    -----3------
    -----------1-------
    1
    ----2------
    -----3------
    -----------1-------
    2
    ----2------
    -----3------
    -----------1-------
    3
    ----2------
    -----3------
    -----------1-------
    5
    ----2------
    -----3------
    -----------1-------
    8
    ----2------
    -----3------
    -----------1-------
    13
    ----2------
    -----3------
    -----------1-------
    21
    ----2------
    -----3------
    -----------1-------
    34
    ----2------
    -----3------
    -----------1-------
    55
    ----2------
    -----3------
    ---stop------
    

    None

    def testp():
        i = 0
        while i<5:
            temp = yield i
            print(temp)
            i+=1
    
    t = testp()
    # ret = t.__next__()
    # print(ret)
    # # next(t) 与下面的方法等价
    # t.__next__()
    for num in t:
        print(num)
    0
    None
    1
    None
    2
    None
    3
    None
    4
    None
    

    send("xxx")不能放在刚开始,否则会出错,send(NONE)可放在生成器开头,相当于next()

    >>> def test():
    ...     i = 0
    ...     while i<5:
    ...             temp = yield i
    ...             print(temp)
    ...             i+=1
    ... 
    >>> t = test()
    >>> t.__next__()
    0
    >>> t.send("ahh")
    ahh
    1
    >>> t.__next__()
    None
    2
    >>> t.send("xjx")
    xjx
    3
    

    相关文章

      网友评论

          本文标题:python——生成器

          本文链接:https://www.haomeiwen.com/subject/cgdnrftx.html