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
posted @ 2021-06-20 00:08  Circle_Wang  阅读(511)  评论(0编辑  收藏  举报