image.png

开头介绍的这个文章总结的很详细,而且大多的介绍其实都是这么写的,也是这些例子。但是手册的介绍也很重要。此处,我主要写一些个人的理解要点

1.生成其是一种更容易实现简单对象迭代。所以他的本质其实是相当于有助于更好的实现 foreach 等方式的迭代

系能和复杂性大大降低

3.生成器允许你在 foreach 代码块中写迭代一组数据,而不需要在内容中创建一个数组。(正常来说我们都是遍历后赋值给一个变量,但生成器允许你直接使用 yield 接受变量,并最终返回)

4.生成器可以根据需求,对此执行 yield

1.要知道 yield 的使用是实现了 Iterator(迭代器)接口,而这个接口是有相应的方法的,最主要的是它是一步步执行的,一次循环后才能执行下一个。其实这种情况有点像队列,所以适合使用与处理大文件的读取或者大的数据的处理。但是变量的情况就是直接赋值在一个内存里面。

2.还有就是 yield 其实相当于给一个返回的变量赋值,当所有的 yield 执行完毕后,将所有的值全部返回

3.yiled 的写法必须用在函数里面,不可以单独的直接使用。

**Iterator** extends **Traversable** {

/* 方法 */

abstract public [current](http://php.net/manual/zh/iterator.current.php) ( void ) : [mixed](http://php.net/manual/zh/language.pseudo-types.php#language.types.mixed)

abstract public [key](http://php.net/manual/zh/iterator.key.php) ( void ) : scalar

abstract public [next](http://php.net/manual/zh/iterator.next.php) ( void ) : void

abstract public [rewind](http://php.net/manual/zh/iterator.rewind.php) ( void ) : void

abstract public [valid](http://php.net/manual/zh/iterator.valid.php) ( void ) : bool

}

demo.php

function createRage($num = 10)

{

for ($i = 0; $i < $num; $i++) {

yield time();

}

}

foreach (createRage(10) as $item) {

sleep(1);

echo $item.'
';

}

image.png

yield.php

$start = microtime(true);

function createRage($num = 10)

{

for ($i = 0; $i < $num; $i++) {

yield time();

}

}

foreach (createRage(10000000) as $item) {

echo PHP_EOL;

}

echo memory_get_usage(); //393088

echo '
';

echo microtime(true)-$start; // 结果 6.6504390239716

foreach.php

$start = microtime(true);

function createRage($num = 10)

{

$data = [];

for ($i = 0; $i < $num; $i++) {

$data[] = time();

}

return $data;

}

foreach (createRage(10000000) as $item) {

echo PHP_EOL;

}

echo memory_get_usage();

echo '
';

echo microtime(true)-$start;

image.png

如果数据小一点,我拿 1000000 十万的数据测试,发现使用 yield 是可以快2s左右。已经是一个很大的差距了

image.png

注意 生成器生成的结果是一个生成器对象,可以通过 foreach 遍历获取所有的数据,但是不能够直接像一个数组一样的对待他

image.png

php 生成器作用,php 生成器的理解和使用相关推荐

  1. python 生成器原理_python生成器

    基础知识 生成器是python的一个特别特的特性,在许多场合都有重要应用.比如range函数产生的就是一个生成器.其主要的好处就是降低了内存的占用.为什么呢?拿range函数来讲吧,它的目的是生成一系 ...

  2. php. 生成器 send,PHP生成器细说

    之前写过关于生成器的文章,可能还不够详细,正好群里有朋友在讨论.觉得还是有必要再细说下,如果大家做过Python或者其他语言的,对于生成器应该不陌生.生成器是PHP 5.5.才引入的功能,也许大家觉得 ...

  3. python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)

    1.1迭代器 什么是迭代器: 迭代器是一个可以记住遍历的位置对象 迭代器对象从集合的第一个元素元素开始访问,直到所有元素被访问完结束,迭代器只能往前不会后退. 迭代器有两个基本方法:iter ,nex ...

  4. 异步生成器_使用生成器实现异步并等待

    异步生成器 Nowadays we can write our asynchronous code in a synchronous way thanks to the async and await ...

  5. python生成器迭代器_python 生成器 迭代器

    阅读目录 一 递归和迭代 二 什么是迭代器协议 三 python中强大的for循环机制 四 为何要有for循环 五 生成器初探 六 生成器函数 七 生成器表达式和列表解析 八 生成器总结 一 递归和迭 ...

  6. php获取笔顺矢量,笔顺生成器在线-笔顺生成器php版源码下载-西西软件下载

    笔顺生成器php版源码,笔顺生成器在线工具及其源码资源,可以通过输入汉字来获取对应的笔顺以及书法方式,可以用来进行线上教育以及辅助工作,还能通过源码资源来进行掌握了解.本次放出笔顺生成器工具资源下载, ...

  7. Day13 推导式、推导式试题、集合推导式、生成器函数、生成器表达式

    1.推导式 通过一行循环判断,遍历出一系列数据的方式就是推导式特点:方便,简介,可以实现一些简单的功能推导式当中只能跟循环和判断(单项分支)种类中分为三种: 列表推导式,集合推导式,字典推导式 [va ...

  8. Python中的yield关键字及表达式、生成器、生成器迭代器、生成器表达式详解

    文章目录 1. yield关键字及表达式.生成器.生成器迭代器.生成器表达式 1.1 yield关键字及表达式(yield expression) 1.1.1 yield关键字 1.1.2 yield ...

  9. Python学习day12(生成器,列表/生成器推导式)

    Python学习day12(生成器,列表/生成器推导式) 生成器 初始生成器 我们知道的迭代器有两种:一种是调用方法直接返回的,一种是可迭代对象通过执行iter方法得到的,迭代器有的好处是可以节省内存 ...

最新文章

  1. python读取数据校验数据_Python通过Schema实现数据验证方式
  2. bzoj1854: [Scoi2010]游戏
  3. Android Crash战斗日记(一、原理篇)
  4. 修改VIM恶心的注释自动格式化
  5. Python语言学习之数值、小数、空格那些事:python和数值、小数、空格的使用方法之详细攻略
  6. 数学专业学计算机哪一行,计算数学
  7. 广播地址的作用_跟百哥学网络16:ARP地址解析协议分析
  8. 用 RxSwift 实现通用的响应式转场
  9. js中的Promise简单总结(ES6)
  10. bootstrap设计登录页面_前端小白如何在10分钟内打造一个爆款Web响应式登录界面?...
  11. 邹欣对话图灵奖得主Jeffrey Ullman:数据库不会进入周期性的坏循环|《新程序员》...
  12. Crossing Road Simulation
  13. Atitit 登录账号管理法passport 目录 1. 总则 1 1.1. 身份分类登录账号 管理员 操作人员 普通用户 1 1.2. 安全考虑,必须单独分开的账号储存表,使用不同等加密技术与秘
  14. Atitit 账号实名制验证等制度和手段 1. 实名制 - 身份证明的一种制度 免费编辑 修改义项名 1 1.1. 匿名制优缺点 2 1.2. 而实名制的弊端缺点是可影响信息安全,造成信息或隐私泄露。
  15. Atitit USRqc62204 证书管理器标准化规范
  16. 朝阳正规的计算机学校有哪些,朝阳都有哪些专科学校
  17. 三菱plc分拣程序_基于三菱PLC控制的物料自动分拣模型
  18. 计算机显示桌面图标不见了,电脑显示器桌面图标不见了怎么办
  19. linux用户目录互信,linux 互信不生效
  20. Python中的与或非

热门文章

  1. 前端学习(627):数据类型
  2. 前端学习(596):使用network waterfall分析页面载入性能
  3. spring mvc学习(7):springmvc学习笔记(常用注解)
  4. html:(15):用css样式给表格添加边框和caption标签
  5. 实例42:python
  6. python如何使用字典中的值并进行比较_python嵌套字典比较值与取值的实现示例
  7. Ubuntu16.04安装搜狗输入法后有黑边问题的解决方法
  8. XMPP之openfire无法启动
  9. css--block formatting context
  10. libev源码分析--常用的watcher