前言
yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白yield的用法。最近又重新学习了下,所以整理了下面这篇文章,供自己和大家学习参考,下面话不多说了,来一起看看详细的介绍吧。
先来看一个例子
def foo(): print("starting...") while True: res = yield print("res:",res)g = foo()next(g)
在上面的例子里,因为foo函数中有yield关键字,所以foo()函数的执行结果g是一个生成器,此时可以使用next(g)或者g.__next__()方法触发生成器的执行
程序的执行结果为
starting...
使用next(g)触发生成器的执行时,程序会按照正常的顺序从上向下执行,遇到yield,程序就会暂停
并把yield后面所接的值返回
打印next(g)的执行结果
def foo(): print("starting...") while True: res = yield print("res:",res)g = foo()print(next(g))
程序执行结果
starting...None
在上面的例子里,执行一次next(g)方法,程序暂停在yield那一行,此时再次调用next(g),程序会从yield语句那一行继续向下运行
修改上面的代码,多调用几次next方法,并打印next方法的返回结果
def foo(): print("starting...") while True: res = yield print("res:",res)g = foo()print(next(g))print("*"*20)print(next(g))
上面这段代码的执行结果为
starting...None********************res: NoneNone
可以看到,程序确实按猜想的步骤运行,但是上面的程序也有一个很明显的缺点:那就是上面的代码没有任何的实际意义:res的值永远为None
在实际的开发中,使用yield表达式形式的目的是yield可以得到一个值,然后yield把这个值赋值给某个变量,这样才有实际意义
那应该怎么操作才能为res变量赋一个值呢??那就是调用生成器自身的send方法
send方法可以触发一次生成器执行,同时还可以把send方法的参数传递给yield
修改上面的代码
def foo(): print("starting...") while True: res = yield print("res:",res)g = foo()next(g)print(g.send(5))
程序的执行结果为:
starting...res: 5None
来分析一下上面的代码的执行过程 :
1.程序开始执行以后,因为foo函数中有yield关键字,所以foo函数并不会真的执行,而是先得到一个生成器g.
2.直到调用next方法,foo函数正式开始执行,先执行foo函数中的print方法,然后进入while循环
3.程序遇到yield关键字,程序暂停,此时next(g)语句执行完成
新闻热点
疑难解答