生成器的创建方式

根据程序设计者制定的规则循环生成数据,当条件不成立时则生成数据结束

数据不是一次性全部生成出来,而是使用一个,再生成一个,可以节约大量的内存。

创建生成器的方式

① 生成器推导式

② yield 关键字

☆ 生成器推导式

与列表推导式类似,只不过生成器推导式使用小括号。

1
2
3
4
5
6
7
8
9
# 创建生成器
my_generator = (i * 2 for i in range(5))
print(my_generator)
# next获取生成器下一个值
# value = next(my_generator)
# print(value)
# 遍历生成器
for value in my_generator:
print(value)

生成器相关函数:

1
2
next 函数获取生成器中的下一个值
for 循环遍历生成器中的每一个值

yield生成器

yield 关键字生成器的特征:在def函数中具有yield关键字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def generator(n):
for i in range(n):
print('开始生成...')
yield i
print('完成一次...')
g = generator(5)
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g)) -----> 正常
print(next(g)) -----> 报错
Traceback (most recent call last):
File "/Users/cndws/PycharmProjects/pythonProject/demo.py", line 14, in <module>
print(next(g))
StopIteration
1
2
3
4
5
6
7
8
def generator(n):
for i in range(n):
print('开始生成...')
yield i
print('完成一次...')
g = generator(5)
for i in g:
print(i)
1
2
3
4
5
6
7
8
9
10
11
def generator(n):
for i in range(n):
print('开始生成...')
yield i
print('完成一次...')
g = generator(5)
while True:
try:
print(next(g))
except StopIteration:
break

注意点:

  • ① 代码执行到 yield 会 暂停 ,然后把结果返回出去,下次启动生成器会在暂停的位置继续往下执行
  • ② 生成器如果把数据生成完成,再次获取生成器中的下一个数据会抛出一个 StopIteration 异常 ,表示停止迭代异常
  • ③ while 循环内部没有处理异常操作,需要手动添加处理异常操作
  • ④ for 循环内部自动处理了停止迭代异常,使用起来更加方便, 推荐使用

yield关键字和return关键字

如果不太好理解yield,可以先把yield当作return的同胞兄弟来看,他们都在函数中使用,并履行着返回某种结果的职责。

这两者的区别是:

return的函数直接返回所有结果,程序终止不再运行,并销毁局部变量;

1
2
3
4
5
def example():
x = 1
return x
example = example()
print(example)

而有yield的函数则返回一个可迭代的 generator(生成器)对象,你可以使用for循环或者调用next()方法遍历生成器对象来提取结果。

1
2
3
4
5
6
7
8
def example():
x = 1
y = 10
while x < y:
yield x
x += 1
example = example()
print(example)