Python中对于yield的个人理解

时间:2021-09-07 23:29:20

</pre>学习yield,自己的一点理解,可能有不对,欢迎指正<p></p><p></p><p>yield定义了一个生成器,每次都会return一个值,返回之后到下次调用的时候,在上次调用结束的地方开始继续执行,并且使用原来的数据不变</p><p>同时,调用返回的其实是一个迭代器结果,因此可以使用for in语句</p><p></p><p>再说明两点,对这个生成器的访问有next()和send('xxxx')两种方式</p><p>两者都会返回下一条yield语句的那个值,但是send可以传一个参数,可以修改当前yield语句的赋值</p><p></p><p>例如:</p><p></p><p></p><pre name="code" class="python">def h():
print 'step1'
yield 1
tt = yield 2
print tt, "oooooo"
yield tt
yield 3


c = h()
n1 = c.next()
print n1
vv = c.next()
print vv
str = c.send('bupt')
print str
print c.next()


n1= next()

执行到yield 1这句,执行了一个print,同时会返回一个1给n1


vv = c.next()这句,从上次执行地方开始继续执行,执行到yield 2这个地方

返回2给vv


send('bupt')执行到yield tt这句,但是send传送了一个参数 bupt,上次执行到yield 2这个地方,然后用这个参数修改,这样就变成了 yield ‘bupt’,同时tt被修改,返回给str


最后一个next,就自然而然返回3了


但是用迭代器的方式访问,就可以安全访问到最后一个yield之后的一些东西,例如:


def my_generator(): 
print 'starting up'
yield 1
print "workin'"
yield 2
print "still workin'"
yield 3
print 'done'

for n in my_generator():
print n




参考文章如下:

参考1

参考2

参考3