# 生成器(Generator)
'''
在 Python中,把使用了yield的函数成为生成器(generator)
生成器是一种特殊的迭代器,
它在形式上和函数很像,只是return换成了yiled。
函数在遇到return关键字时,会返回值并结束函数。
而生成器在遇到yiled关键字时,会返回迭代器对象,但不会立即结束,而是保存当前的位置,
下次执行时会从当前位置继续执行。
'''
# 下面分别使用普通函数和生成器实现斐波那契数列的功能,依次来说明它们的不同之处。
# (1)定义普通函数
# 普通斐波那契函数定义
def get_fibonacci(max):
# max:数量
fib_list = [0,1]
# 保存菲波那切数列的列表,初始值为0和1
while len(fib_list) < max:
fib_list.append(fib_list[-1]+fib_list[-2])
# 最后两个值相加
return fib_list
# 主函数
if __name__ == "__main__":
# 函数调用,输出前10个斐波那契数列的值:0 1 1 2 3 5 8 13 21 34
for m in get_fibonacci(10):
print(m,end=" ")
'''
因为函数只能返回一次,所以每次计算得到的斐波那契数列必须全部存储到列表中,
最后再使用return将其返回。
'''
# (2)使用yield的函数--生成器
# 使用yield的菲波那切函数定义
def get_fibonacci2(max):
n1 = 0
# 第一个值
n2 = 1
# 第二个值
num = 0
# 记录数量
while num < max:
yield n1
n1,n2 = n2,n1+n2
num += 1
# 主函数
if __name__ == "__main__":
# 输出前10个斐波那契数列的值:0 1 1 2 3 5 8 13 21 34
for n in get_fibonacci2(10):
print(n,end=" ")
'''
yield一次返回一个数,不断返回多次。
程序执行的流程图如下:
通过函数get_fibonacci2()实现菲波那切数列时,没有将其保存于列表中,
而是通过yield实时将其返回
在主函数中,使用for循环遍历生成器。
执行第一次循环时,调用生成器函数get_fibonacci2(),
函数运行到yield时,返回n1,函数暂停执行,并记录当前位置,
然后执行for循环的循环体print(n,end=" "),打印n1的值。
下一次循环,函数从上次暂停的位置继续执行,直到遇到yield,
如此往复,直到结束。
'''
普通函数和生成器的区别
最新推荐文章于 2022-04-11 16:41:25 发布