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

posted @ 2019-08-20 22:46  月色深潭  阅读(1764)  评论(0编辑  收藏  举报