例子:
上图中标明了 行号出现的顺序
从顺序中可以看到
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 defyield_test(n):2 for i inrange(n):3 print(str(sys._getframe().f_lineno) + "before.")4 yieldcall(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 defcall(i):11 return i * 2
12
13
14 #print(yield_test(4)) #
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 79before.2 94forb.3 i=04 96fora.5 81after.6 i====07 83afterPrint.8 79before.9 94forb.10 i= 2
11 96fora.12 81after.13 i==== 1
14 83afterPrint.15 79before.16 94forb.17 i= 4
18 96fora.19 81after.20 i==== 2
21 83 afterPrint.
参考:
https://blog.csdn.net/mieleizhi0522/article/details/82142856
https://blog.csdn.net/wxyangid/article/details/79514040