python 关于yield使用,代码案例

本篇重点帮助理解:yield返回参数,以及接受调用者发出的参数。

def test():
    print("start!!!!")
    r = 'initial'
    while True:
        result = yield r
        print("result:",result)
t = test()

此处,t 是一个生成器。包含yield的函数就是生成器函数,调用这个函数就是一个生成器。

t
Out[20]: <generator object foo at 0x000001EBABDCF7D8>

如何启动这个生成器?

#method 1
t = test()
t.send(None)
start!!!!
Out[23]: 'initial'
#method 2
t = test()
next(t)
start!!!!
Out[24]: 'initial'

由于send方法是包含next方法,以上两种都可以启动生成器。关于send方法,会在下面进一步讲解,从字面理解就是发送的意思。send可以传递参数到上次挂起的yield的返回值,而next方法只能传递None. 启动生成器时,next(t) 和 t.send(None)作用是一样的。之所以是send(None)是因为一开始并没有yield接收值。

那么问题来了,启动了生成器又如何?程序是如何执行的?不难看出,启动生成器,先打印了"start!!!", 给r赋值,接着进入while,遇到 yield 会返回。因为一开始 r 为 “initial"字符串,启动生成器后,yield r, 返回的便是"initial”。
重点问题:result = yield r; 生成器启动后,result 是什么? 答案是 result 没有被赋值,因为遇到yield就返回了,赋值并没有执行。再次调用next()方法后,会接着之前没有完成的地方继续完成,也就是给result赋值。由于之前返回了r, 但是并没有赋值给result, 那么再次回到result赋值,右边已经没有值了,于是result便为None. 程序继续执行,接下来就是打印result, 结果显示如下. 打印完result, 再次进入while, 遇到yield r, 于是返回"initial",result仍然没有被赋值。在这个过程中,r 一直都是"initial", 没有被重新赋值

next(t)
result: None
Out[27]: 'initial'

再次调用next方法,下面的结果和上面一样

next(t)
result: None
Out[28]: 'initial'

那么如何才能给result成功赋值呢?下面就要用到 yield 可以接收调用者参数的特性
调用send方法,会把send的参数,传到上次yield返回的地方,也就是给result 赋值的右边,注意此操作并没有改变 r 的值, 只是把send的参数赋值给了result。打印完result,程序继续执行,再次进入while, yield r返回,仍是"initial",result赋值没有执行

t.send(8)
result: 8
Out[29]: 'initial'

由于上次result没有被赋值,再次调用next方法,result 就又成了None.

next(t)
result: None
Out[30]: 'initial'
发布了5 篇原创文章 · 获赞 0 · 访问量 186

猜你喜欢

转载自blog.csdn.net/HighDS/article/details/103799009
今日推荐