iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 11
0
自我挑戰組

學習筆記系列 第 16

yield 語法

  • 分享至 

  • xImage
  •  

記錄學習內容。看網路上大大們的文章和影片,做些紀錄。
以下內容大多來自網路上大大們的文章。
還不太了解,內容可能有錯誤。

接著看了
Coroutines in C/C++

總覺得跟協程(Coroutines),好像不太一樣,總之就先了解python的 yield 怎麼用 。

這篇文章很清楚:
python中yield的用法详解——最简单,最清晰的解释

筆記:

1 function有關鍵字yield 代表 這個function 被呼叫得時候,並不會真的執行,而是先得到一個東西而已。
2 調用next 方法 ,才真正執行這個有yield關鍵字的function
3 執行function後,遇到yield關鍵字時 ,把yield 當成return 。
4 如果再次調用next 方法 ,會從yield 的下一行繼續執行 。

先看一下python迴圈
Python 初學第四講 — 迴圈

sequences = [0, 1, 2, 3, 4, 5]
for i in sequences:
print(i) //0 1 2 3 4 5
也就是說for i in sequences 代表 會 走訪完sequences

所以這段程式碼,就想成不斷調用next 方法,執行次數 就是 直到rangeN(1, 5) 執行完全部內容。(還是不了解,就先這樣記吧)

def rangeN(a, b):
    print("start")
    i = a #1
    while (i < b):  # b=5
        yield i  #return 1 2 3 4
        i += 1  # 下一次從這邊執行,所以第二次後都會在迴圈裡  
  
for i in rangeN(1, 5): 
        print(i)

結果:

start
1
2
3
4

後來文章有講C語言自己寫一個DIY的 yield 。
用了一個state 當狀態值 。第一次執行後 就會讓state 變成1 。
之後的程式state都會是1 ,就會在迴圈裡,繼續執行迴圈 。

這邊用了static,所以i和state才會一直保留

    static long long int i; 
    static int state = 0; 

關於這個static 的意思,參考:
C/C++ 中的 static, extern 的變數

一般我們寫 funcion 時,裡面宣告的變數在 funcion 結束之時也會跟著消失。但如果我們在某個變數之前加上 static,該變數就不會因為 function 結束而消失。

#include<stdio.h> 
  
int range(int a, int b) 
{ 
    static long long int i; 
    static int state = 0; 
    printf("hi "); 
    switch (state) 
    { 
    case 0: /* start of function */
        state = 1; 
        for (i = a; i < b; i++) 
        { 
            return i; 
        /* Returns control */
        case 1:; /* 因為之後的state都是1,所以都會到這 */
        }

    } 
    state = 0; 
    return 0; 
} 

int main() 
{ 
    int i; //For really large numbers 
  
    for (; i=range(1, 5);) 
        printf("main :%d\n", i); 
  
    return 0; 
} 

結果

hi main :1
hi main :2
hi main :3
hi main :4
hi

DIY的 yield , 跟用關鍵字yield的不太一樣。
如果是關鍵字yield 的 ,不會每次都從function最前面開始執行,應該只會有一次hi 。

文章講了這段:

We need to do two things:
1 Resume control to its last state
2 Make data persist through calls

應該是指
main() 代表 caller 呼叫者
range(int a, int b) 代表 callee 被呼叫者
main() 呼叫 range(int a, int b) , range(int a, int b) 要保存最近一次的狀態和資料 ?

其他:
Thread.yield() | GeeksforGeeks
java的Thread.yield() ,是暫停目前的Thread ,讓其他的thread先執行的意思。


上一篇
協程 (coroutine)
下一篇
Leetcode 1192 Critical Connections in a Network
系列文
學習筆記46
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言