今天写代码遇见了yield这个关键字,在我的映像中是用来生成生成器(generator)的。网上很多教程,很多信息都说这个yield如何如何的,都让我很费解,无奈下只好翻出参考书,认真阅读了一些yield的信息。
yield究竟是个什么东西呢?说白了就是特殊的return而已,与return不同的是,return返回后,函数直接结束;而yield返回后,程序是冻结的。也许说的太抽象,可以看看下面这个代码。
#return与yield的区别
def test(one):
print("函数启动...")
step = 2#设置步进长,便于下文理解
cur = 0#设置步进开始点,便于下文理解
for i in range(one):
cur += step
print("这是函数执行的第"+str(i)+"步")
print("此时步位位于第"+str(cur)+"处")
yield cur#函数执行到此处,实行冻结;专业术语说就是生成器的暂停处
t = test(10)
print(t)
print(next(t))
print(next(t))
在上文中有个函数test(one),运行后的结果如下:
看执行结果,可以知道,上述的for循环并没有执行完毕,原因是什么呢?就是关键字yield造成的。程序执行到yield cur时,函数test返回cur并陷入冻结状态,也就是说返回cur后,程序不再执行for循环了,直接执行下面的程序。
在代码段中,有一段是t = test(10),表示用test函数生成一个生成器(generator)。
当程序被yield冻结后,只有调用next()函数或遍历生成器时才能获取下一个循环值,函数才会真正的执行。
有对比才有效果,把上述的程序的yield替换成return。如下:
#return与yield的区别
def test(one):
print("函数启动...")
step = 2#设置步进长,便于下文理解
cur = 0#设置步进开始点,便于下文理解
for i in range(one):
cur += step
print("这是函数执行的第"+str(i)+"步")
print("此时步位位于第"+str(cur)+"处")
return cur#函数执行到此处,实行冻结;专业术语说就是生成器的暂停处
t = test(10)
print(t)
print(next(t))
print(next(t))
执行结果如下:
看见没,直接报错,说到这应该懂了吧?贵在自悟,多的说多无益。