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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM