python中的yield语句是如何工作的,pythin yield
其实我不知道yield是因为学了迭代,生成器,PHP手册。是协和吗?我还不知道PHP里有yield这样的鬼。人是从PHP 5.5引入的,正式名称是generator。为什么从现在开始你要推出5.5版本的产品?还想问问大家,以前有一个用PHP 5.3的命名空间,这几年因为毛才正式开始生产。
然后,问题就发生了。这有什么用?
先感受一下问题。给它100Kb的内存。是的,没错。100千字节.)然后,逐步重复输出1到10000的数组。
数组重复的次数越多,首先创建的数组就越多。
所以,拍额头的时候,代码会是这样的。
$ start _ mem=memory _ get _ usage(;
$arr=range(1,10000);
Foreach($arras$item ) {
//echo $item。,;
}
$ end _ mem=memory _ get _ usage(;
echo usemem:。(end _ mem-$ start _ mem)。字节数。PHP _ EOL
一个操作更厉害,性能1-5。请感受一下:
528440字节,约528Kb,差不多是100Kb的5倍。妈妈活不过这一天了。
你也知道,最近内存价格真的很高,国家也号召低碳节能减排。如果多使用5倍的内存,就意味着多排放5倍的二氧化碳。你会为使用更多内存付出很大代价,对吧。想想吧。那是一根棍子。
人们走投无路,所以屈服可以来拯救。恐怕代码如下。请注意操作:
$ start _ mem=memory _ get _ usage(;
函数yield _ range(start,end){
wile($start=$end ) {
$ start
yield $ start
}
}
foreach (yield _ range (0,9999 ) as $item ) {
echo $item。,;
}
$ end _ mem=memory _ get _ usage(;
echo usemem:。(end _ mem-$ start _ mem)。字节数。PHP _ EOL
请尝试执行它。感受一下。
首先,我们来观察一下名为yield_range的函数和普通函数的区别。普通函数经常使用return返回结果,其中是yield。其次,在普通函数中,return只返回一次。这个产量会重复很多次。
所以,我们来分析一波这个不可思议的yield_range函数。这个yield关键字到底返回什么?让我们简单看一下:
函数yield _ range(start,end){
wile($start=$end ) {
$ start
yield $ start
}
}
$ RS=yield _ range (1,100);
var _ dump($ RS;
/*
对象(生成器)#1(0) {
}
*/
Yield返回一个名为Generator的object对象,它实现了迭代器接口。)关于迭代器接口的信息,请参考PHP文档。所以,既然实现了迭代器接口,(所以,这个东西可以用foreach迭代,懂吗?显示,其中包含以下代码:
函数yield _ range(start,end){
wile($start=$end ) {
yield $ start
$ start
}
}
$ generator=yield _ range (1,10);
//valid(current) (next))都是迭代器接口的方法。
while($generator-valid ) ) }
echo $generator-current()。PHP _ EOL
$ generator-next(;
}
执行结果如下。
重要的是,这个yield_range函数似乎记得它最后一次执行的位置和结果。然后,在下一次执行之前,从上次结束的地方继续。这是普通PHP函数做不到的!
我们知道操作系统在调度进程时会启动“切换进程上下文”的概念。例如,如果CPU从进程A被分派到进程B,当它再次从进程B被分派到进程A时,无论进程A最初在哪里运行,临时数据结果都必须被恢复。否则一切从零开始,问题就大了。而且这个yield关键字似乎可以在用户态(非系统内核级)实现这个概念。所以反复使用yield可能真的没希望了。可以做的事情太多了。
接下来,您需要一种理解名为send的生成器对象的方法。让我们简单看一下下面的代码。
函数yield _ range(start,end){
wile($start=$end ) {
$ ret=yield $ start
$ start
echo yield receive:。$ ret.PHP _ eol;
}
}
$ generator=yield _ range (1,10);
$ generator-send($ generator-current))* 10);
执行结果如下。
派遣方法可以修改产量的返回值。但是,如下面的代码所示,您认为执行结果会怎么样?
函数yield _ range ($ start,$end ) {
wile($start=$end ) {
$ ret=收益率$ start
$ start
“回显”产生接收:“.$ ret.PHP _ eol;
}
}
$ generator=yield _ range (1,10);
Foreach($generatoras$item ) {
$ generator-send($ generator-current))* 10);
}
我以为运行结果是这样的:
接收产量:10
接收产量:20
接收产量:30
接收产量:40
接收产量:50
已接收: 60
接收产量:70
接收产量:80
接收产量:90
接收产量:100
但在唯物主义中
结果就是打脸。感受一下。
原因是什么呢?因为xjjzg从外部向产量发送派遣时,会自动启动下一个。自己试试吧。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。