资讯专栏INFORMATION COLUMN

PHP的迭代器和生成器

sanyang / 1974人阅读

摘要:生成器的内部一直在停顿和恢复之间切换,直到循环完成或停顿位置缺点生成器不能满足所有迭代器的需求,因为如果不查询,生成器永远不知道下一个要迭代的值是什么,在生成器中无法后退或前进。

一.迭代器

分析:想一下,如果把集合对象和对集合对象的操作放在一起,当我们想换一种方式遍历集合对象中元素时,就需要修改集合对象了,违背“单一职责原则”,而迭代器模式将数据结构和数据结构的算法分离开,两者可独立发展。

优点:

支持多种遍历方式。比如有序列表,我们根据需要提供正序遍历、倒序遍历两种迭代器。用户只需要得到我们的迭代器,就可以对集合执行遍历操作

简化了聚合类。由于引入了迭代器,原有的集合对象不需要自行遍历集合元素了

增加新的聚合类和迭代器类很方便,两个维度上可各自独立变化

为不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上操作

缺点:

迭代器模式将存储数据和遍历数据的职责分离增加新的集合对象时需要增加对应的迭代器类,类的个数成对增加,在一定程度上增加系统复杂

具体接口:

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 )
}

简单的foreach迭代器实现

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引入的功能,与标准的PHP迭代器不同,PHP生成器不要求类实现Iterator接口,从而减轻了类的负担,生成器会根据需求计算并产出要迭代的值,这对性能有重大的影响试想一下假如标准的PHP迭代器经常在内存中执行迭代操作者要预先计算出数据集性能低下;如果要使用特定的的方式对计算大量数据,对性能的影响更甚。此时我们可以使用生成器,即时计算产出后续值不占用宝贵的内存资源。
优点:

占用内存少对,性能好。每次产出一个值之后,生成器的内部状态都会停顿;当生成器请求下一个值时,内部状态又会恢复。生成器的内部一直在停顿和恢复之间切换,直到循环完成或停顿位置

缺点:

PHP生成器不能满足所有迭代器的需求,因为如果不查询,生成器永远不知道下一个要迭代的值是什么,在生成器中无法后退或前进。

生成器还是一次性的,无法多次迭代同一个生成器,不过,如果需要,可以重建或克隆生成器。

 
创建生成器:

因为生成器就是PHP函数,生成器就是在函数中使用yield关键字。与普通的PHP函数不同的是,生产器从不返回值,只产出值。

    

调用生成器函数时,PHP会返回一个属于Generator类的对象。
这个对象可以使用foreach()函数迭代。每次迭代,PHP会要求Generator实例计算并提供下一个要迭代的值

    

如上所示:
当$length 很大时(上百万),而且你同时没有使用生成器的话,那么就要预先为一个由一百万上一千五个整数组成的数组分配内存。而PHP生成器能实现相同的操作,不过一次只会为一个整数分配内存

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29442.html

相关文章

  • pythonmemory_profiler库制作器和迭代器cpu占用时间分析

      文章内容主要是详细介绍了pythonmemory_profiler库制作器和迭代器cpu占用的时间分析,文章内容紧扣主题进行详尽的基本介绍,感兴趣的朋友可以了解一下  不进行计算时,生成器和list空间占用  importtime   frommemory_profilerimportprofile   profile(precision=4)   deflist_fun():   start...

    89542767 评论0 收藏0
  • ES6-迭代器(iterator)和成器(generator) - 什么是迭代器和成器

    摘要:我个人认为迭代器和生成器是新增的特性里面,非常重要的部分,充分地掌握和使用迭代器和生成器,是十分必要和重要的,所以我会写关于二者的一系列文章。 我个人认为迭代器和生成器是es6新增的特性里面,非常重要的部分,充分地掌握和使用迭代器和生成器,是十分必要和重要的,所以我会写关于二者的一系列文章。话不多说,先来了解一下基本概念:一:什么是迭代器 1: 迭代器是一个对象 2: 迭代器有一个属性...

    CollinPeng 评论0 收藏0
  • python奇遇记:迭代器和成器

    摘要:来说说迭代器和生成器,还有可迭代对象和生成器表达式。有点绕是不是,其实,一般只要知道可迭代对象以及它是如何实现的就行了,中常常用生成器来代替迭代器,可以说,生成器就是迭代器。 来说说迭代器和生成器,还有可迭代对象和生成器表达式。 之前简单的提到过,一个对象是可迭代的可以理解为能够使用for循环。这样说其实不太准确,某个对象可迭代是因为它内部实现了$__iter__$这个特殊方法。比如在...

    atinosun 评论0 收藏0
  • Python中迭代对象、迭代器和成器

    摘要:本文重点掌握可迭代的对象的定义掌握可迭代对象迭代器与生成器之间的关系和异同熟悉标准库中生成器。二迭代器迭代器介绍迭代器用于从集合中取出元素的对象。若想再次迭代须重建迭代器。迭代器检查方式调用,。区别可迭代的对象不是迭代器。 导语:本文章记录了本人在学习Python基础之控制流程篇的重点知识及个人心得,打算入门Python的朋友们可以来一起学习并交流。 本文重点: 1、掌握可迭代的对象的...

    starsfun 评论0 收藏0
  • Python基础-迭代器和成器

    摘要:迭代器迭代器用于循环构建和扩展集合类型逐行遍历文本文件列表推导字典推导和集合推导元组拆包调用函数时,使用拆包实参解释器需要迭代对象时,会自动调用内置的函数,有以下功能检查对象是否实现了方法,如果实现了就调用它,获取一个迭代器。 迭代器 迭代器用于: for 循环 构建和扩展集合类型 逐行遍历文本文件 列表推导、 字典推导和集合推导 元组拆包 调用函数时, 使用 * 拆包实参 解释器...

    objc94 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<