目前我學的三個語言都有支援 generators,一般來說我們會用 foreach 去跑 Iterator,假設我們創建了一個極大的 array variable,非常佔用記憶體,而 generators 的出現就是解決這個問題,當你真的要取值時才使用 yield 吐出資料,最常見的範例就是爬檔案了,一般寫法是把檔案內容整個讀進來 memory,然後你在對他進行 iterator 的訪問,假設該檔案有五萬行資料,你的東西在第十筆就找到了,那剩下的四萬多筆資料只是單純浪費記憶體空間而已,接下來實做三個語言的 generators 用法
PHP
<?php function go($length) { for ($i = 0; $i < $length; $i++) { yield $i; } } foreach (go(10) as $value) { echo $value, PHP_EOL; }
node.js
function* go(length) { for (let i = 0; i < length; i++) { yield i; } } for (value of go(10)) { console.log(value); }
python
def go(length): for value in range(10): yield value for value in go(10): print(value)
上面的程式執行後都會得到 0-9,而 python 在這個部份有很多變化,像是可以用 xrange
這個 function 拿到一個 generator 的結果,寫法也比較多變化
x = [v for v in range(10)] print(x) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] x = (v for v in range(10)) print(x) # <generator object <genexpr> at 0x7fe2b60916e0> for value in x: print(value) # 0 1 2 3 4 5 6 7 8 9
沒有留言:
張貼留言