php之生成器

引用手册:一个生成器函数看起来像一个普通的函数,不同的是普通函数返回一个值,而一个生成器可以yield生成许多它所需要的值。当一个生成器被调用的时候,它返回一个可以被遍历的对象.当你遍历这个对象的时候(例如通过一个foreach循环),PHP 将会在每次需要值的时候调用生成器函数,并在产生一个值之后保存生成器的状态,这样它就可以在需要产生下一个值的时候恢复调用状态。

以下这句话会让让上面手册的内容更加的理解明白。
yield关键字 :生成器函数的核心是yield关键字。它最简单的调用形式看起来像一个return申明,不同之处在于普通return会返回值并终止函数的执行,而yield会返回一个值给循环调用此生成器的代码并且只是暂停执行生成器函数。

为什么要用生成器?手册上说道,一个简单的例子就是使用生成器来实现range函数;因为如果使用range函数生成一个很大的数组的时候,那么占用内存是非常大的,所以使用生成器可以很好的解决这个问题。

注:请使用5.4以上版本

我在这里使用手册里面的例子来说明一下使用生成器实现range函数;在这里我把手册的演示删除了一点代码,这样就可以专注来说生成器了:

先看一个最简单的例子:

<?php
//定一个函数
function gen_one_to_three() {//for循环for ($i = 1; $i <= 3; $i++) {//注意变量$i的值在不同的yield之间是保持传递的。yield $i;}
}//yield会返回一个值给循环调用此生成器的代码并且只是暂停执行生成器函数。
$generator = gen_one_to_three();
foreach ($generator as $value) {echo "$value\n";
}
?>

随后输出了 1 2 3

我们再看以下xrange实现(我删掉了一些代码):

<?php
//定义xrange函数
function xrange($start, $limit, $step = 1) {//如果start小于limit那么就if ($start < $limit) {//yield会返回一个值给循环调用此生成器的代码并且只是暂停执行生成器函数。for ($i = $start; $i <= $limit; $i += $step) {yield $i;}} else {//yield会返回一个值给循环调用此生成器的代码并且只是暂停执行生成器函数。for ($i = $start; $i >= $limit; $i += $step) {yield $i;}}
}/* * 注意下面range()和xrange()输出的结果是一样的。*/echo 'Single digit odd numbers from range():  ';
//在这里使用range函数
foreach (range(1, 9, 2) as $number) {echo "$number ";
}
echo "<br/>";echo 'Single digit odd numbers from xrange(): ';
//在这里我们使用自定义的xrange
//注意:yield会返回一个值给循环调用此生成器的代码并且只是暂停执行生成器函数。
//所以她们的输出是相同的
foreach (xrange(1, 9, 2) as $number) {echo "$number ";
}
?>

输出如下如下:
这里写图片描述

生成一个键值对:这里使用的也是php手册里面的例子,在这里我把解释写在了代码的注释中了

<?php
/* * 下面每一行是用分号分割的字段组合,第一个字段将被用作键名。*///input变量
$input = <<<'EOF'
1;PHP;Likes dollar signs
2;Python;Likes whitespace
3;Ruby;Likes blocks
EOF;//定义方法 参数为input
function input_parser($input) {foreach (explode("\n", $input) as $line) {//使用explode方法用\n分隔$input字符串为数组 并且使用了foreach$fields = explode(';', $line); //分隔$line的值,此时line的值中例如 1;PHP;Likes dollar signs 用分号分隔为数组$id = array_shift($fields);//使用array_shift删除数组的第一个值并且返回,那么如上注释中说的,那么此时应该id就是1yield $id => $fields; //返回键值对}
}//调用input_parser函数,传入input
foreach (input_parser($input) as $id => $fields) {echo "$id:\n";echo "    $fields[0]\n";echo "    $fields[1]\n";
}
?>

运行如下:
这里写图片描述

身体不适。。。运动过度。。。今天就一篇吧。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用JDBC进行数据库的事务操作(2)

本篇将讲诉如何使用JDBC进行数据库有关事务的操作。在上一篇博客中已经介绍了事务的概念&#xff0c;和在MySQL命令行窗口进行开启事务&#xff0c;提交事务以及回滚事务的操作。 似乎事务和批处理都可以一次同时执行多条SQL命令&#xff0c;但是事务是如果某一条SQL出错&#…

谷歌浏览器之如何快速找到js、css等文件

1 问题 我们分析前端代码的时候&#xff0c;需要快速定位某个js文件&#xff0c;然后查看里面的源代码 2 具体操作 比如我在www.baidu.com这个页面&#xff0c;我们先按下F12, 然后点击到network,然后我们再用快捷键 ctrl p 比如我们要找tu_d03f361.js 效果如下&#x…

HTML5 播放器

随着 HTML5 的普及&#xff0c;越来越多视频网站使用 <video></video> 标签播放直播、点播内容&#xff08;如下图所示&#xff09;。使用 <video> 的好处&#xff0c;主要以下两点。 可以直接在页面中播放&#xff0c;也就是所谓的“区域播放”&#xff0c;…

linux shell之控制台打印各种颜色字体和背景

1 问题 控制台打印各种颜色字体和背景 字体颜色 #30:黑 #31:红 #32:绿 #33:黄 #34:蓝色 #35:紫色 #36:深绿 #37:白色 背景颜色 #40:黑 #41:深红 #42:绿 #43:黄色 #44:蓝色 #45:紫色 #46:深绿 #47:白色 echo -e "\e[43;35m chenyu\e[0m hello word&quo…

修改GIT的user.name和user.email

为什么80%的码农都做不了架构师&#xff1f;>>> $ git config --global --replace-all user.email "输入你的邮箱" $ git config --global --replace-all user.name "输入你的用户名" ----验证是否修改成功---- $ git config --list 转载…

sql distinct 去重复 (mysql)

DISTINCT 去重复 &#xff08;运动扭伤腰。。。悲伤。。。 (▼ _ ▼) &#xff09; 首先&#xff0c;例如我们的表&#xff1a; 首先观察表&#xff1a; 其中第二行和第三行和第八行的name1的只是重复的&#xff0c;但第八行的age1确是12&#xff0c;与第二行和第三行不同…

如何5分钟上手使用OCR

随便打开一个Microsoft Visual Studio&#xff0c;新建一个WinForms项目&#xff0c;从下面列表中随便选择一个NET框架。net35;net40;net45;net451;net452;net46;net461;net462;net47;net471;net472;net48; netstandard2.0;netcoreapp3.1; net5.0;net6.0;创建完窗口后&#xff…

利用Excel VBA批量计算气象数据多个台站多年来春季和冬季降水量和平均气温

气象数据是地理数据的重要组成部分,存储量虽然不大,但是处理过程非常繁琐,长时序数据更不用说。本文总结了一个气象数据的基本处理方法。 如下图所示,气象数据的排列格式是区站号→年→月→降水量→平均气温,时间范围为1983~2012年,每一年都有台站数300多个,下面按区站…

VMware Workstation 12新建虚拟机

1、点击“创建新的虚拟机”2、选择“自定义”(初学选择典型也可以)&#xff0c;下一步3、默认&#xff0c;直接下一步4、通常都是先创建虚拟机&#xff0c;等虚拟机创建完成后再来安装操作系统&#xff0c;若安装过程出现什么问题方便解决&#xff0c;故选择“稍后安装操作系统…

sql count用法_SQL学习笔记3:count(*)函数

1.count(*)函数用法COUNT(*) 函数返回表中的记录数&#xff0c;具体来说&#xff0c;返回值是一个数字。语法&#xff1a;返回表中所有记录的数量&#xff1a;SELECT COUNT(*) FROM table_name返回表中满足一定条件的记录的数量&#xff1a;SELECT COUNT(*) FROM table_name WH…

sql order by,desc和limit使用(mysql)

(&#xff61;ŏ_ŏ) 首先我们来看一个表&#xff1a; 在此我们要进行排序&#xff0c;按降序排序&#xff0c;就是从大到小。然后我们只要查询前2条数据。 意思就是我们需要把这个表从大到小排序后&#xff0c;取前两条&#xff0c;那么我们就需要使用到order by 和desc …

Blazor University (13)组件 — 多线程渲染

原文链接&#xff1a;https://blazor-university.com/components/multi-threaded-rendering/多线程渲染由于 Blazor Server 应用程序中可用的线程不止一个&#xff0c;因此完全有可能不同的组件可以让不同的线程在其上执行代码。这在基于异步任务的操作中最常见。例如&#xff…

sql 之like 和通配符%,_(mysql)

(&#xff61;ŏ_ŏ) like模糊查询&#xff0c;啥叫模糊查询&#xff1f; 例如&#xff1a;我们一个数据库里面存在在一个人叫做李二三四。我们忘记了他的名字&#xff0c;只记得他的姓名&#xff0c;那么我们就可以使用like加上通配符来查询出我们所要的结果&#xff1b;话说…

php邮件代码c语言,C语言实现邮件发送功能(SMTP)源码

【实例简介】C 语言编写的邮件发送器是SMTP协议的源代码和EXE执行程序均在里面使用VS2013开发环境生成&#xff0c;填写对应参数即可成功进行邮件发送&#xff0c;不用配置邮件服务器&#xff0c;只需一个支持SMTP协议的邮箱账号密码即可【实例截图】【核心代码】#include #inc…

【线性筛】【质因数分解】【约数个数定理】hdu6069 Counting Divisors

d(x)表示x的约数个数&#xff0c;让你求&#xff08;l,r<10^12,r-l<10^6,k<10^7&#xff09; #include<cstdio> using namespace std; #define MOD 998244353ll #define MAXP 1000100 typedef long long ll; ll x,y; int T,K; bool isNotPrime[MAXP10]; int num…

C#/.Net 不要再使用Aspose和iTextSharp啦!QuestPDF操作生成PDF更快更高效!

QuestPDFQuestPDF是一个开源的工具库&#xff0c;可以在.NET或者.Net Core中生成pdf文档它提供了一个布局引擎&#xff0c;设计时考虑到了完整的分页支持以及灵活性要求&#xff01;比市面上常见的Aspose和iTextSharp好用太多了&#xff01;GitHub地址安装Install-Package Ques…

C#创建桌面快捷方式

1、添加引用Windows Script Host Object Model,并引用命名空间using IWshRuntimeLibrary; 2、代码 using System; using IWshRuntimeLibrary; using System.Windows.Forms;namespace WindowsFormsApplication1 {public partial class Form1 : Form{public Form1(){InitializeC…

Java报表工具FineReport导出EXCEL的四种API

在实际的应用中会经常需要将数据导出成excel&#xff0c;导出的方式除原样导出还有分页导出、分页分sheet导出和大数据量导出。对于excel 2003版&#xff0c;由于限制了每个sheet的最大行数和列数&#xff0c;大数据量导出时会默认时分多个sheet&#xff0c;而excel2007不会出现…

sql in 用法(mysql)

我们先看一个如下数据库表&#xff1a; 我们如果想查询这张表里面age为11和1的人该怎么办呢&#xff1f; 那么我们的 in 操作符就起作用了&#xff1a; SELECT * FROM table1 WHERE age1 IN(11,1); 查询来自表哥table1的数据&#xff0c;条件为age1 在(11,1)这两个数之中…