使用了 yield 的函数被称为生成器(generator)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
list1 = [1, 2, 3]
# 创建一个生成器 类似于列表推导式 外面是元组
#
my_generator = (i ** 2 for i in range(5))
# generator object 是一个生成器对象
print(my_generator, type(my_generator))
# 获取生成器中的值 从第一个值开始获取
value = next(my_generator)
print(value)
# 遍历获取生成器中的值
for j in my_generator:
print(j)
运行结果:
<generator object <genexpr> at 0x000001F127C00970> <class ‘generator’>
0
1
4
9
16
# 创建生成器的方式
# 生成器函数
def my_generator():
for i in range(5):
print("开始创建")
# 只要有yield就是生成器
yield i
print("完成一次生成")
if __name__ == '__main__':
# g是生成器对象
g = my_generator()
print(g, type(g))
# 拿取生成器中的第一个值
value = next(g)
print(value, type(value))
# 遍历生成器,拿取剩余的值
for j in g:
print(j)
运行结果:
<generator object my_generator at 0x000001D721E564A0> <class ‘generator’>
开始创建
0 <class ‘int’>
完成一次生成
开始创建
1
完成一次生成
开始创建
2
完成一次生成
开始创建
3
完成一次生成
开始创建
4
完成一次生成
进程已结束,退出代码为 0
用生成器输出斐波那契数列
def fibo(n):
result = []
for i in range(n):
print("开始创建")
if i <= 1:
result.append(i)
yield result
else:
result.append(result[i - 1] + result[i - 2])
yield result
# 只要有yield就是生成器
print("完成一次生成")
if __name__ == '__main__':
num = int(input("请输入你要输出几项"))
f = fibo(num)
for j in f:
print(j)
运行结果:
请输入你要输出几项6
开始创建
[0]
完成一次生成
开始创建
[0, 1]
完成一次生成
开始创建
[0, 1, 1]
完成一次生成
开始创建
[0, 1, 1, 2]
完成一次生成
开始创建
[0, 1, 1, 2, 3]
完成一次生成
开始创建
[0, 1, 1, 2, 3, 5]
完成一次生成
进程已结束,退出代码为 0
结束