9.3 生成器函数的使用

生成器函数,函数里包含 yield 关键字

  • yield
  • 不再是普通的函数
def gen_func():
    yield 1
    yield 2
    yield 3

# 惰性求值,延迟求值提供了可能性
# 斐波拉契函数 0 1 1 2 3 5 8 ...
def fib(index):
    if index <= 2:
        return 1
    else:
        return fib(index-1) + fib(index-2)

def func():
    return 1

if __name__ == '__main__':
    # 返回为生成器对象,python编译字节码的时候产生
    gen = gen_func()

    # 生成器对象也是实现了迭代协议的,可以for循环
    for value in gen:
        print(value)

    ret = func()
  • 执行生成器函数得到生成器对象,可for循环取值
  • 生成器函数可以多次返回值,流程的变化
# 获取对应位置的值
def fib(index):
    if index <= 2:
        return 1
    else:
        return fib(index-1) + fib(index-2)


# 获取整个过程
def fib2(index):
    ret_list = []
    n, a, b = 0, 0, 1
    while n < index:
        ret_list.append(b)
        a, b = b, a + b
        n += 1
    return ret_list


# yield
def gen_fib(index):
    n, a, b = 0, 0, 1
    while n < index:
        yield b
        a, b = b, a + b
        n += 1


print(fib(10))
print(fib2(10))
for value in gen_fib(10):
    print(value)

斐波拉契 1 1 2 3 5 8 …

  • 根据位置获取对应值
  • 根据位置获取所有值