yield函数的执行顺序

Posted 月色深潭

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了yield函数的执行顺序相关的知识,希望对你有一定的参考价值。

 

例子:

上图中标明了  行号出现的顺序

从顺序中可以看到

1.开始先执行for循环,执行到93行yield_test(1)时,会调用函数yield_test(),所以打印了79行内容

2.到80行时,遇到了yield,yield可以理解为return,所以93行yield_test(1)得到返回值0

3.接着开始执行94-96行代码

4.当再一次执行93行(for循环)时,从上图顺序中可以看到,程序执行了81-83行。因为n是1,所以这边程序也就停止执行了。

执行结果

从上面的结果中可以看到,yield函数被再次调用时,并不是从函数第一行代码开始执行,而是从yield语句后面一行开始的。

 

 

把上面例子中n改成3

 1 def yield_test(n):
 2     for i in range(n):
 3         print(str(sys._getframe().f_lineno) + " before.")
 4         yield call(i)
 5         print(str(sys._getframe().f_lineno) + " after.")
 6         print(\'i====\', i)  # 输出的是当前的i值
 7         print(str(sys._getframe().f_lineno) + " afterPrint.")
 8 
 9 
10 def call(i):
11     return i * 2
12 
13 
14 #print(yield_test(4))  # <generator object yield_test at 0x0000000001DE9200>
15 
16 
17 for i in yield_test(3):
18     print(str(sys._getframe().f_lineno) + " forb.")
19     print(\'i=\', i)  # 输出的是yield函数的返回值  yield函数,相当于一个return语句:下次迭代时候,代码从yield的下一个语句开始执行
20     print(str(sys._getframe().f_lineno) + " fora.")

结果:可以看到下面结果,yield后面语句执行完成后,才继续从yield函数的第一行继续执行。   yield可以看做return,但是return后面语句将不再执行,而yield在下一次执行时,会将yield后面语句先执行完成。

 1 79 before.
 2 94 forb.
 3 i= 0
 4 96 fora.
 5 81 after.
 6 i==== 0
 7 83 afterPrint.
 8 79 before.
 9 94 forb.
10 i= 2
11 96 fora.
12 81 after.
13 i==== 1
14 83 afterPrint.
15 79 before.
16 94 forb.
17 i= 4
18 96 fora.
19 81 after.
20 i==== 2
21 83 afterPrint.

 

 

 

参考:

https://blog.csdn.net/mieleizhi0522/article/details/82142856

https://blog.csdn.net/wxyangid/article/details/79514040

以上是关于yield函数的执行顺序的主要内容,如果未能解决你的问题,请参考以下文章

对同一链中的 boost::asio::yield 执行顺序感到困惑

yield用法

Python生成器

python yield函数

python yield函数

python中yield是啥意思