Python 之生成器

# 注意:yield的作用是第一次执行生成器时程序停在yield所在行,并返回yield后的值。
# 第二次执行生成器时,程序会在第一次停止的位置执行 ,以此类推。。。
# send(None) 相当于 第一次 next()的效果

# 斐波那契数列
def create_num():
    print("----start----")
    i, j = 0, 1
    for k in range(5):
        yield j
        i, j = j, i + j
    print("----end----")

def test():
    i = 0
    while i < 5:
        temp = yield i
        print(temp)
        i += 1

if __name__ == "__main__":
    a = [x for x in range(10)]
    print(a)
    # 如果数据比较多时,就比较占用内存了,所以可以采用生成器

    # 生成器的创建方式一
    b = (x for x in range(10))
    print(b)  # <generator object <genexpr> at 0x007AAEB0>
    # 获取数据,第二个参数是指定获取对应位置的值
    print(next(b, 1))  # 0
    print(next(b, 2))  # 1
    print(next(b, 3))  # 2
    # 注意:如果第二个参数不填,则每执行一次,就获取下一个, 如下:
    print(next(b))  # 3
    print(next(b))  # 4
    print(next(b))  # 5

    # 生成器创建方式二:在函数内部使用了yield关键字
    create = create_num()
    print(create)  # <generator object creat_num at 0x0077AE70>
    print(next(create)) # 1
    print(next(create)) # 1
    print(next(create)) # 2
    print(create.__next__())
    # 遍历生成器
    '''
    ----start----
    1
    1
    2
    3
    5
    ----end----
    '''
    for num in create:
        print(num)

    # 生成器之send的用法
    '''
    0
    haha
    None
    2
    '''
    test = test()
    print(test.__next__())
    test.send("haha") # 将haha赋给temp
    print(test.__next__())

 

posted @ 2019-05-11 22:17  样子2018  阅读(221)  评论(0编辑  收藏  举报