Python中yield的使用方法
本博文参考自:https://blog.csdn.net/mieleizhi0522/article/details/82142856
yield使用方法
含有yield字段的函数相当于是一个生成器(迭代器),意味着在函数被普通调用的时候是不会执行内部语句块的,只有当使用next()来调用的时候,才会执行函数内部语句块。如果没法理解可以先把yield直接看是return,然后我们来看例子。
def foo():
print("starting...")
while True:
res = yield 4
print("res:",res)
g = foo()
执行上述语句块不会返回任何的东西,换句话说g=f(),只是相当于生成了一个名叫g的一个生成器。
接下来我们继续执行。
print("打印",next(g))
starting...
打印 4
我们可以看到当我们执行next(g)时,函数块内部语句被执行了,并且还返回了一个4,这是为什么呢?我们单步执行看一下:
1、当调用next(g)时,开始执行函数内部语句print("starting..."),因此出现了第一个打印。
2、接下来开始进入到了while循环,但此时碰到了yield 4,因此在进行res的赋值之前,函数就返回了4,程序并没有执行res的赋值操作,那后面打印的语句print("res:",res)也就更不会被执行了。
接下来我们再看看下面的代码:
def foo():
print("starting...")
while True:
res = yield 4
print("res:",res)
g = foo()
print("打印",next(g))
print("*"*20)
print(next(g))
starting...
打印 4
********************
res: None
4
前面两行的打印原因上面已经介绍了,第三行打印是为了更好看,因此做了个分隔打印(print("*"*20))。第四行的打印是什么意思呢?
我们继续接着单步执行:
1、当函数执行到print("*"*20),于是打印出了一行的********************
2、接下来再次执行next(g)的时候,他会从上次停止的地方继续执行,因此会执行res的赋值操作,但是咱们会发现res的打印结果并不是4,这是因为上一次执行g的时候4被返回了,因此res是没有东西给他赋值的,所以res最后就是None
3、接下来是print("res:",res),所以出现了res: None的打印结果
4、接下来会继续在while循环里(因为程序依然没有收到返回的指令),因此又到了res = yield 4这一行,接下来的结果就是依然4被提前返回了。所以打印的是4
我们接下来看看带有参数的函数是怎样的情况。
def foo(a):
print("starting...")
while True:
res = yield a
print("res:",res)
g = foo(1)
print("打印",next(g))
print("*"*20)
print(next(g))
starting...
打印 1
********************
res: None
1