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
本文来自博客园,作者:月色深潭,交流群:733423266,转载请注明原文链接:https://www.cnblogs.com/moonpool/p/11386142.html