你应该知道带有yield关键字的函数不再是一个简单的函数,而是一个生成器generator,那啥叫生成器呢?
生成器
简单说生成器就是迭代器,相应的它也是可以迭代的对象,但是它实现了一边循环,一边进行计算的这种机制。
案例1.列表推导式:
li=[i for i in range(10)]
上述列表推导式实现了一个[0,1,2,3,4,5,6,7,8,9]这样一个列表,但是这个列表是一次性生成所有元素,然后存储在内存中的,假如range中我填入1百万或者1千万的数据呢,内存是有限制的,这样生成这么多的数据,可能就撑爆你的内存了,并且你可能只访问很少的一些数据,这就大大浪费了你的内存。此时生成器的优点就体现出来了:生成器不会一次性生成能容纳所有的数据的列表,即它不会创建完整的列表,这就大大减少了内存的占用。
yield关键字
下列代码定义了一个函数f,for循环遍历,使用yield返回i,yield后面的代码是为了测试,
def f():
for i in range(5):
yield i
print('我是yield之后的代码')
print()
res=f()
for i in res: #对生成器对象进行遍历
print(i)
我使用的是打断点进行调试,下面将一一证明:
1.带了yield关键字的函数是一个生成器,并且调用函数f()并不会执行函数里面的代码,而是先得到了一个生成器对象,只有遍历时,才会执行。
2.每次函数f()执行到yield处就会停止,下次从yield停止的地方继续执行,即可以记住函数代码执行的位置。
(1))带了yield关键字的函数是一个生成器: 在函数调用处打断点,可以看到得到的是一个生成器对象
(2)在yield及之后的代码进行打断点,查看执行的顺序:每次函数f()执行到yield处就会停止,下次从yield停止的地方继续执行,即可以记住函数代码执行的位置。
录制的GIF动图: