python中的yield语句是如何工作的,pythin yield

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: