热门推荐

随便看看

深入理解yield

2019-10-03 12:17

  www.65644b.com,yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白yield的用法。

  只是粗略的知道yield可以用来为一个函数返回值塞数据,比如下面的例子:

  取出alist的每一项,然后把i + 1塞进去。然后通过调用取出每一项:

  假如你看到某个函数包含了yield,这意味着这个函数已经是一个Generator,它的执行会和其他普通的函数有很多不同。比如下面的简单的函数:

  可以看到,调用h之后,print 语句并没有执行!这就是yield,那么,如何让print 语句执行呢?这就是后面要讨论的问题,通过后面的讨论和学习,就会明白yield的工作原理了。

  表达式(yield 5)的返回值将赋值给m,所以,认为 m = 5 是错误的。那么如何获取(yield 5)的返回值呢?需要用到后面要介绍的send(msg)方法。

  现在,我们来揭晓yield的工作原理。我们知道,我们上面的h被调用后并没有执行,因为它有yield表达式,因此,我们通过next语句让它执行。next语句将恢复Generator执行,并直到下一个yield表达式处。比如:

  当我们再次调用c.next时,会继续执行,直到找到下一个yield表达式。由于后面没有yield了,因此会拋出异常:

  了解了next如何让包含yield的函数执行后,我们再来看另外一个非常重要的函数send(msg)。其实next和send在一定意义上作用是相似的,区别是send可以传递yield表达式的值进去,而next不能传递特定的值,只能传递None进去。因此,我们可以看做

  需要提醒的是,第一次调用时,请使用next语句或是send(None),不能使用send发送一个非None的值,否则会出错的,因为没有yield语句来接收这个值。

  send(msg) 和 next是有返回值的,它们的返回值很特殊,返回的是下一个yield表达式的参数。比如yield 5,则返回 5 。到这里,是不是明白了一些什么东西?本文第一个例子中,通过for i in alist 遍历 Generator,其实是每次都调用了alist.Next,而每次alist.Next的返回值正是yield的参数,即我们开始认为被压进去的东东。我们再延续上面的例子:

  因此,当我们调用了close方法后,再调用next或是send(msg)的线

 
平一肖公式规律| 红叶高手心水论坛资料| 香港挂牌之篇最完整篇| 本港台开奖结果直播fl| 最老板极准生肖特马诗| 港妹图库自选商城最早| 跑狗图今期我最旺| 王中王香港开奖结果现场直播| 小香港四肖中特期期准| 香港管家婆最新玄机图|