迭代器和生成器

2021-10-24 11:55:58 字數 2019 閱讀 8414

生成器迭代是訪問集合元素的一種方式。迭代和遍歷非常相似,但是還是有區別的:

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...