首先在理解yield关键字之前,我们要学习一下关于迭代、迭代器和生成器的前置知识:
而yield就是用来构成生成器的一个关键字
首先讨论一下,通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
举个例子,给出一个题目,让你给出斐波那契数列的第一百项,如果使用列表生成式,那么我们需要创建一个百万级的列表来进行储存,空间复杂度奇大,显然是不可以被接受的。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
而yield的用处呢,就是将你定义的函数变为一个生成器,即其返回的值是一个生成器对象,下面给一个简单的例子
def yield_test(n):
for i in range(n):
yield call(i)
print("i=",i)
#做一些其它的事情
print("do something.")
print("end.")
def call(i):
return i*2
#使用for循环
for i in yield_test(5):
print(i,",")
0 ,
i= 0
2 ,
i= 1
4 ,
i= 2
6 ,
i= 3
8 ,
i= 4
do something.
end.
大致如此,通过使用yield构成的生成器,我们可以对代码进行优化