一、生成器的创建方式

生成器:根据算法生成数据的一种机制,每次调用生成器只生成一个值,可以节省大量内存

1. 生成器推导式

  • 与列表推导式类似,只不过生成器推导式使用小括号
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 创建生成器
my_generator = (i * 2 for i in range(5))
print(my_generator)

# next获取生成器下一个值
value = next(my_generator)
print(value)

value = next(my_generator)
print(value)

print('----------')
# 遍历生成器
for value in my_generator:
print(value)

# <generator object <genexpr> at 0x100cc7990>
# 0
# 2
# ----------
# 4
# 6
# 8

2. yield 关键字

  • 只要在def函数里面看到有 yield 关键字那么就是生成器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
def mygenerater(n):
for i in range(n):
print('开始生成...')
yield i
print('完成一次...')


if __name__ == '__main__':

g = mygenerater(5)
# while True:
# try:
# result = next(g)
# print(result)
# except StopIteration as e:
# break

# # for遍历生成器, for 循环内部自动处理了停止迭代异常,使用起来更加方便
for i in g:
print(i)

# 开始生成...
# 0
# 完成一次...
# 开始生成...
# 1
# 完成一次...
# 开始生成...
# 2
# 完成一次...
# 开始生成...
# 3
# 完成一次...
# 开始生成...
# 4
# 完成一次...

二、生成器的使用场景

1. 斐波那契数列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def fibonacci(num):
a = 0
b = 1

# 记录生成fibonacci数字的下标
current_index = 0

while current_index < num:
result = a
a, b = b, a + b
current_index += 1
# 代码执行到yield会暂停,然后把结果返回出去,下次启动生成器会在暂停的位置继续往下执行
yield result


fib = fibonacci(5)
# 遍历生成的数据
for value in fib:
print(value)

# 0
# 1
# 1
# 2
# 3