記錄學習內容。看網路上大大們的文章和影片,做些紀錄。
以下內容大多來自網路上大大們的文章。
還不太了解,內容可能有錯誤。
總覺得跟協程(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先執行的意思。