例子:
上圖中標明了 行號出現的順序
從順序中可以看到
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