迭代器和生成器

2021-09-11 14:03:54 字數 2176 閱讀 5284

我們在用迴圈語句迭代資料時,必須要初始化乙個變數來記錄每一次迭代在資料集合中的位置,

var values = [1, 2, 3];

for(var i=0, len=values.length; i上面的for迴圈通過變數i跟蹤陣列的索引。雖然語法簡單,但是如果將多個迴圈巢狀則需要追蹤多個變數,**的複雜度會大大增加,迭代器的出現旨在消除這種複雜性並減少迴圈中的錯誤。

迭代器迭代器是一種特殊物件,都有乙個next()方法,每次呼叫都返回乙個結果物件,結果物件有兩個屬性:

done 是乙個布林型別值,當沒有更多可返回的資料時返回true

可迭代物件和for-of迴圈

在es6中,所有的集合物件(陣列、set集合、map集合)和字串都是可迭代物件,這些物件中都有預設的迭代器。我們現在再來看一開始的迴圈內部索引跟蹤的問題,可以通過for-of解決:

var values = [1, 2, 3];

for(var i of values)

可迭代物件都有symbol.iterator屬性,for-of迴圈的**通過呼叫這個屬性來獲取迭代器,每次迴圈都會呼叫迭代器的next()方法,並將迭代器返回的結果物件的value屬性儲存在乙個變數中,迴圈將持續執行到返回物件的done屬性為true。

3. 內建迭代器

在es6中有三種型別的集合物件:陣列、map集合和set集合,他們都內建了以下三種迭代器:

var values = [1, 2, 3];

for(let entry of values.entries())

結果:

[ 0, 1 ]

[ 1, 2 ]

[ 2, 3 ]

在for-of迴圈中,如果沒有顯式指定則使用預設的迭代器,陣列和set集合預設的迭代器是values()方法,map集合的預設迭代器是entries()方法。

4. 生成器

生成器是一種返回迭代器的函式,通過function關鍵字後的「*」來表示,函式中會用到新的關鍵字yield,使用yield會返回任何其後的值或表示式:

function *f () 

//生成器的呼叫方式和普通函式一樣,只不過返回的是乙個迭代器

let iterator = f();

console.log(iterator.next());

console.log(iterator.next());

console.log(iterator.next());

console.log(iterator.next());

輸出:

function *f (items) )

}

function *f () 

let iterator = f();

console.log(iterator.next()); //第一次呼叫next()方法時傳入值的話會被丟棄

console.log(iterator.next(4));

console.log(iterator.next(5));

console.log(iterator.next());

結果:

非同步任務執行器

利用yield會暫停當前函式的執行過程並等待下一次呼叫next()方法的特性next()語句將恢復generator執行,並直到下乙個yield表示式處。比如:

function run (taskdef) 

result = task.next(data);

//遞迴呼叫

step();

})}else

}} //開始迭代執行

step();

}//讀取檔案函式

var fs = require('fs');

function readfile(filename)

}//執行生成器函式

run(function* () )

console.log("我先來")

結果:

6

我先來978

done

生成器和迭代器

可以直接作用於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...