# 生成器函数 函数里面只要有yield关键字,就是一个生成器函数
# 生成器对象也是实现了迭代器协议了的
def gen_func():
    yield 1
    yield 2
    yield 3


def func():
    return 1


# 斐波拉契函数  a1 + a2 = a3
# 0,1,1,2,3,5,8,13
def fib(index):
    '''
    :param index:   第index个数
    :return:
    '''
    if index == 0:
        return 0
    elif index < 3:
        return 1
    else:
        return fib(index - 1) + fib(index - 2)


def fib1(index):
    # 这个方式,如果result_list中数据太多,内存撑爆
    result_list = []
    n, a, b = 0, 0, 1
    while n < index:
        result_list.append(b)
        a, b = b, a + b
        n += 1
    return result_list


def gen_fib(index):
    # 使用生成器不存在内存撑爆的问题,因为数据是计算一个取一个的
    n, a, b = 0, 0, 1
    while n < index:
        yield b
        a, b = b, a + b
        n += 1


if __name__ == '__main__':
    # gen = gen_func()  # 返回的是一个生成器对象, 这个对象在python编译子节码就生成了
    # for g in gen:
    #     print(g)

    # 正常的函数
    # re = func()


    print(fib(10))
    print(fib1(10))
    gen = gen_fib(10)
    for g in gen:
        print(g, end=',')
posted on 2019-12-15 22:40  显示账号  阅读(241)  评论(0编辑  收藏  举报