成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHP的迭代器和生成器

sanyang / 2094人閱讀

摘要:生成器的內(nèi)部一直在停頓和恢復(fù)之間切換,直到循環(huán)完成或停頓位置缺點(diǎn)生成器不能滿足所有迭代器的需求,因?yàn)槿绻徊樵?,生成器永遠(yuǎn)不知道下一個(gè)要迭代的值是什么,在生成器中無(wú)法后退或前進(jìn)。

一.迭代器

分析:想一下,如果把集合對(duì)象和對(duì)集合對(duì)象的操作放在一起,當(dāng)我們想換一種方式遍歷集合對(duì)象中元素時(shí),就需要修改集合對(duì)象了,違背“單一職責(zé)原則”,而迭代器模式將數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu)的算法分離開(kāi),兩者可獨(dú)立發(fā)展。

優(yōu)點(diǎn):

支持多種遍歷方式。比如有序列表,我們根據(jù)需要提供正序遍歷、倒序遍歷兩種迭代器。用戶只需要得到我們的迭代器,就可以對(duì)集合執(zhí)行遍歷操作

簡(jiǎn)化了聚合類。由于引入了迭代器,原有的集合對(duì)象不需要自行遍歷集合元素了

增加新的聚合類和迭代器類很方便,兩個(gè)維度上可各自獨(dú)立變化

為不同的集合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口,從而支持同樣的算法在不同的集合結(jié)構(gòu)上操作

缺點(diǎn):

迭代器模式將存儲(chǔ)數(shù)據(jù)和遍歷數(shù)據(jù)的職責(zé)分離增加新的集合對(duì)象時(shí)需要增加對(duì)應(yīng)的迭代器類,類的個(gè)數(shù)成對(duì)增加,在一定程度上增加系統(tǒng)復(fù)雜

具體接口:

Iterator extends Traversable {
   /* 方法 */
   abstract public mixed current ( void )
   abstract public scalar key ( void )
   abstract public void next ( void )
   abstract public void rewind ( void )
   abstract public bool valid ( void )
}

簡(jiǎn)單的foreach迭代器實(shí)現(xiàn)

position = 0;
        }
    
        function rewind() {
            var_dump(__METHOD__);
            $this->position = 0;
        }
    
        function current() {
            var_dump(__METHOD__);
            return $this->array[$this->position];
        }
    
        function key() {
            var_dump(__METHOD__);
            return $this->position;
        }
    
        function next() {
            var_dump(__METHOD__);
            ++$this->position;
        }
    
        function valid() {
            var_dump(__METHOD__);
            return isset($this->array[$this->position]);
        }
    }
    
    $it = new myIterator;
    
    foreach($it as $key => $value) {
        var_dump($key, $value);
        echo "
";
    }
?>
二.生成器

PHP生成器(generator)是PHP5.5.0引入的功能,與標(biāo)準(zhǔn)的PHP迭代器不同,PHP生成器不要求類實(shí)現(xiàn)Iterator接口,從而減輕了類的負(fù)擔(dān),生成器會(huì)根據(jù)需求計(jì)算并產(chǎn)出要迭代的值,這對(duì)性能有重大的影響試想一下假如標(biāo)準(zhǔn)的PHP迭代器經(jīng)常在內(nèi)存中執(zhí)行迭代操作者要預(yù)先計(jì)算出數(shù)據(jù)集性能低下;如果要使用特定的的方式對(duì)計(jì)算大量數(shù)據(jù),對(duì)性能的影響更甚。此時(shí)我們可以使用生成器,即時(shí)計(jì)算產(chǎn)出后續(xù)值不占用寶貴的內(nèi)存資源。
優(yōu)點(diǎn):

占用內(nèi)存少對(duì),性能好。每次產(chǎn)出一個(gè)值之后,生成器的內(nèi)部狀態(tài)都會(huì)停頓;當(dāng)生成器請(qǐng)求下一個(gè)值時(shí),內(nèi)部狀態(tài)又會(huì)恢復(fù)。生成器的內(nèi)部一直在停頓和恢復(fù)之間切換,直到循環(huán)完成或停頓位置

缺點(diǎn):

PHP生成器不能滿足所有迭代器的需求,因?yàn)槿绻徊樵儯善饔肋h(yuǎn)不知道下一個(gè)要迭代的值是什么,在生成器中無(wú)法后退或前進(jìn)。

生成器還是一次性的,無(wú)法多次迭代同一個(gè)生成器,不過(guò),如果需要,可以重建或克隆生成器。

?
創(chuàng)建生成器:

因?yàn)樯善骶褪荘HP函數(shù),生成器就是在函數(shù)中使用yield關(guān)鍵字。與普通的PHP函數(shù)不同的是,生產(chǎn)器從不返回值,只產(chǎn)出值。

    

調(diào)用生成器函數(shù)時(shí),PHP會(huì)返回一個(gè)屬于Generator類的對(duì)象。
這個(gè)對(duì)象可以使用foreach()函數(shù)迭代。每次迭代,PHP會(huì)要求Generator實(shí)例計(jì)算并提供下一個(gè)要迭代的值

    

如上所示:
當(dāng)$length 很大時(shí)(上百萬(wàn)),而且你同時(shí)沒(méi)有使用生成器的話,那么就要預(yù)先為一個(gè)由一百萬(wàn)上一千五個(gè)整數(shù)組成的數(shù)組分配內(nèi)存。而PHP生成器能實(shí)現(xiàn)相同的操作,不過(guò)一次只會(huì)為一個(gè)整數(shù)分配內(nèi)存

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29442.html

相關(guān)文章

  • pythonmemory_profiler庫(kù)制作器和迭代器cpu占用時(shí)間分析

      文章內(nèi)容主要是詳細(xì)介紹了pythonmemory_profiler庫(kù)制作器和迭代器cpu占用的時(shí)間分析,文章內(nèi)容緊扣主題進(jìn)行詳盡的基本介紹,感興趣的朋友可以了解一下  不進(jìn)行計(jì)算時(shí),生成器和list空間占用  importtime   frommemory_profilerimportprofile   profile(precision=4)   deflist_fun():   start...

    89542767 評(píng)論0 收藏0
  • ES6-迭代器(iterator)和成器(generator) - 什么是迭代器和成器

    摘要:我個(gè)人認(rèn)為迭代器和生成器是新增的特性里面,非常重要的部分,充分地掌握和使用迭代器和生成器,是十分必要和重要的,所以我會(huì)寫關(guān)于二者的一系列文章。 我個(gè)人認(rèn)為迭代器和生成器是es6新增的特性里面,非常重要的部分,充分地掌握和使用迭代器和生成器,是十分必要和重要的,所以我會(huì)寫關(guān)于二者的一系列文章。話不多說(shuō),先來(lái)了解一下基本概念:一:什么是迭代器 1: 迭代器是一個(gè)對(duì)象 2: 迭代器有一個(gè)屬性...

    CollinPeng 評(píng)論0 收藏0
  • python奇遇記:迭代器和成器

    摘要:來(lái)說(shuō)說(shuō)迭代器和生成器,還有可迭代對(duì)象和生成器表達(dá)式。有點(diǎn)繞是不是,其實(shí),一般只要知道可迭代對(duì)象以及它是如何實(shí)現(xiàn)的就行了,中常常用生成器來(lái)代替迭代器,可以說(shuō),生成器就是迭代器。 來(lái)說(shuō)說(shuō)迭代器和生成器,還有可迭代對(duì)象和生成器表達(dá)式。 之前簡(jiǎn)單的提到過(guò),一個(gè)對(duì)象是可迭代的可以理解為能夠使用for循環(huán)。這樣說(shuō)其實(shí)不太準(zhǔn)確,某個(gè)對(duì)象可迭代是因?yàn)樗鼉?nèi)部實(shí)現(xiàn)了$__iter__$這個(gè)特殊方法。比如在...

    atinosun 評(píng)論0 收藏0
  • Python中迭代對(duì)象、迭代器和成器

    摘要:本文重點(diǎn)掌握可迭代的對(duì)象的定義掌握可迭代對(duì)象迭代器與生成器之間的關(guān)系和異同熟悉標(biāo)準(zhǔn)庫(kù)中生成器。二迭代器迭代器介紹迭代器用于從集合中取出元素的對(duì)象。若想再次迭代須重建迭代器。迭代器檢查方式調(diào)用,。區(qū)別可迭代的對(duì)象不是迭代器。 導(dǎo)語(yǔ):本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之控制流程篇的重點(diǎn)知識(shí)及個(gè)人心得,打算入門Python的朋友們可以來(lái)一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、掌握可迭代的對(duì)象的...

    starsfun 評(píng)論0 收藏0
  • Python基礎(chǔ)-迭代器和成器

    摘要:迭代器迭代器用于循環(huán)構(gòu)建和擴(kuò)展集合類型逐行遍歷文本文件列表推導(dǎo)字典推導(dǎo)和集合推導(dǎo)元組拆包調(diào)用函數(shù)時(shí),使用拆包實(shí)參解釋器需要迭代對(duì)象時(shí),會(huì)自動(dòng)調(diào)用內(nèi)置的函數(shù),有以下功能檢查對(duì)象是否實(shí)現(xiàn)了方法,如果實(shí)現(xiàn)了就調(diào)用它,獲取一個(gè)迭代器。 迭代器 迭代器用于: for 循環(huán) 構(gòu)建和擴(kuò)展集合類型 逐行遍歷文本文件 列表推導(dǎo)、 字典推導(dǎo)和集合推導(dǎo) 元組拆包 調(diào)用函數(shù)時(shí), 使用 * 拆包實(shí)參 解釋器...

    objc94 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<