php5.5引入了迭代生成器的概念,迭代的概念早就在php有了,但是迭代生成器是php的乙個新特性,這跟python3中的迭代生成器類似,看看php5.5的迭代生成器如何定義。
<?php function xrange($start, $end, $step = 1)
}foreach (xrange(1, 1000000) as $num)
注意關鍵字:yield,正是這個yeild關鍵字構建了乙個迭代器,這個函式xrange跟以往的函式的不同之處就在這裡。一般情況都是return乙個值,而yield乙個值就表示這是個迭代器,每迴圈一次這個迭代器就生成這個值,故名為迭代生成器,迭代生成器這個函式可以進行foreach迴圈,每次都產生乙個值。
php5.5之前是通過定義類實現iterator介面的方式來構造迭代器,通過yield構造迭代器將更加提公升效能節省系統開銷。
這種方法的優點是顯而易見的.它可以讓你在處理大資料集合的時候不用一次性的載入到記憶體中,甚至你可以處理無限程式設計客棧大的資料流。
如上面例子所示,這個迭代器的功能是生成從1到1000000的數字,迴圈輸出,那麼使用以往的方式是生成好這1到1000000的數字到陣列中,將會十分占用記憶體,因為是事先就要生成好所有結果,而不是用的時候按需生成,也就是說呼叫xrange這個迭代器的時候,裡面的函式還沒有真正的執行,直到你每一次的迭代。
再看看php官網的例子:
<?php function程式設計客棧 xrange($start, $limit, $step = 1)
}echo 'single digit odd numbers: ';
/* * note that an array is never created or returned,
* which s**es memory.
*/foreach (xrange(1, 9, 2) as $number)
echo "\n";
?>
這裡的xrange是乙個迭代,功能和range是一樣的,如果使用www.cppcns.comrange函式的話,那麼函式內部實現會儲存每個迭代的中間過程,即每個中間變數都有 個記憶體空間,那麼首先程式使用的記憶體空間就大了,而且分配記憶體,**記憶體都會導致程式的執行時間加長。但是如果使用上yield實現的xrange函式的 話,裡面所有的中間變數都只使用乙個記憶體$i,這樣節省的時間和空間都會變小。
那麼為什麼yield會有這樣的效果呢?聯想到lua中的yield,這裡就算是協程的概念了。在lua語言中,當程式執行到yield的時候,使用協程 將上下文環境記錄住,然後將程式操作權歸還到主函式,當主函式呼叫resume的時候,會重新喚起協程,讀取yield記錄的上下文。這樣形成了程式語言 級別的多協程操作。php 5.5這裡的yield也是同樣的道理,當程式執行到yield的時候,當前程式就喚起協程記錄上下文,然後主函式繼續操作,只是php中沒有使用如 resume一樣的關鍵字,而是「在使用的時候喚起」協程。比如上例中的foreach迭代器就能喚起yield。所以上面的這個例子就能理解了。
PHP迭代器和生成器用法例項分析
迭代器 迭代器實際是乙個實現了iterator的類,可以用foreach進行遍歷。例如 public function current public function key public function next public function rewind public function se...
python yield 生成器用法
總結 可以把send 看成是next 的公升級版。send 不僅能像next 一樣觸發生成器的乙個迭代,還能傳入乙個值給yield語句。看下面乙個列子 def func y 1 while true x yield y y 1 print 接收了x format x f func f是乙個初始化好的...
python 基礎(十六)生成器用法舉例
import time defconsumer name print s,準備吃包子 name while true baozi yield print 包子 s來了,被 s吃了 baozi,name c consumer clyde c.next next 呼叫一次 b 香菇油菜餡 c.send ...