生成器迭代是訪問集合元素的一種方式。迭代和遍歷非常相似,但是還是有區別的:
1. 迭代強調的依次取出,不能確定可以取出的值有多少,也不能保證把資料全部取完
2. 遍歷必須保證資料的長度,迴圈不斷的全部取出,針對於資料量過大的情況下使用遍歷需要時間過長
迭代器是乙個可以記住遍歷的位置的物件。迭代器物件從集合的第一 個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。
通俗的說,只需要滿足以下條件就可以成為迭代器:
1. 取出下乙個資料的能力
2. 判斷是否有下乙個資料
不同的語言中,表現出來的迭代形式不一樣。在js中如果規定乙個物件有next方法,並且返回乙個物件,就認為這個物件是迭代器。
下面根據上面的描述來實現乙個簡單的迭代器:
const obj =
}}
這就是乙個簡單的迭代器。用迭代器來實現斐波拉契數列:
function
createfeibo()
else
const result =
prev2 = prev1;
prev1 = result.value;
n++;return result
}}}const iter =
createfeibo
()
在瀏覽器呼叫next方法就能拿到資料。
生成器就是通過建構函式genertaor創造出來的物件,生成器既是乙個迭代器,同時也是乙個可迭代物件。通過上面描述,可能認為是這樣建立:
const obj=
newgenerator
()
但是這種建立是錯誤的,應該這樣建立:
function
*test()
在函式名之前加上*就表示該函式是生成器函式。
只能在函式內部使用,表示產生乙個迭代資料,每一次呼叫生成器中的next方法,會將生成器函式執行到下乙個yield關鍵字的位置。
也可以這樣理解:當函式執行到這一行的時候,程式會從這裡暫停,yield相當於return會返回,當下次迭代時候,則會從yield的下一行**開始執行。下面用生成器來實現斐波拉契數列:
function
*creatrferibo()
else
n++;}
}const iter =
creatrferibo
()
注意點:
1.生成器有返回值,出現在最後一次的done為true的value
2.呼叫生成器中的next方法時,可以傳遞引數,傳遞的引數可以交給yield表示式的返回值
3.第一次去呼叫next時,傳遞的引數是沒有任何含義的
.return()
表示提前結束生成器函式,這個迭代過程也提前結束。
使用之後,直接結束了生成器,再次呼叫next方法值就為undefined,done為true。
.throw ()
可以在生成器產生乙個錯誤,丟擲到對應的行中去.
生成器和迭代器
可以直接作用於for迴圈的物件稱為可迭代物件 iterable.可以用isinstance 判斷乙個物件是否是iterable物件。isinstance iterable true isinstance iterable true isinstance 235,iterable false 而生成器...
迭代器和生成器
1 迭代器的概念 print dir 告訴我列表的所有用法 有雙下劃線的所有方法叫做雙下方法,是c語言已經寫好的方法。你可以用不止一種方法呼叫它。列表的用法變集合 set dir 求交集 set dir set dir set dir 求列表,字典,字串它們的用法的交集 他們共同的用法 iterab...
生成器和迭代器
1.iterator 迭代器 舉例 我們對list使用for for i in 1,2,3,4 print i 12 34對string物件使用for for ch in python print ch py thon對字典物件使用for for k in print k yx對檔案使用for fo...