Python中的yield用法,python中yield语句的作用

  Python中的yield用法,python中yield语句的作用

  本文主要介绍python中yield函数的用法和数据库。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下。

  首先,如果你对收益率没有一个初步的认识,那么你首先要把收益率想成“回报”,这是很直观的。一开始是回归。普通返回是什么意思,就是在程序中返回某个值,返回后程序不会运行下来。把return看做生成器的一部分(带yield的函数才是真正的迭代器)。好吧,如果你不明白这些,先把yield看成return,然后直接看下面这个程序,你就明白yield的全部含义了:

  def foo():

  打印(开始.)

  而True:

  res=收益率4

  打印( res: ,res)

  g=foo()

  打印(下一个(g))

  打印( **20)

  打印(下一个(g))

  仅仅几行简单的代码就能让你知道什么是yield。代码的输出是这样的:

  开始.

  四

  ********************

  res:无

  四

  我直接解释代码运行顺序,相当于代码单步调试:

  1.程序开始执行后,因为foo函数中有yield关键字,所以foo函数不会真正执行,而是先获得一个生成器G(相当于一个对象)。

  2.直到调用下一个方法,foo函数才正式开始执行,先执行foo函数中的print方法,然后进入while循环。

  3.程序遇到yield关键字,然后把yield当成return。返回4后,程序停止,并且不执行res的赋值操作。这时,next(g)语句的执行就完成了,所以输出前两行(第一行是上面print above的结果,第二行是return的结果,返回执行print(next(g)的结果)。

  4.程序执行print( * * * 20)并输出20 *

  5.再次开始以下打印(下一步(g))。这次和上一次类似,不同的是这次是从刚才下一个程序停止的地方开始,也就是要进行res的赋值操作。这时,需要注意的是,此时赋值操作的右边没有值(因为one刚刚返回出去,并且没有参数被传递到赋值操作的左边),所以此时的res赋值是None,那么接下来的。

  6.程序会在while中继续执行,再次返回4,然后程序会停止。print函数输出的4就是这次返回的4。

  到这里你可能就明白yield和return的关系和区别了,带yield的函数是一个生成器,而不是一个函数了,这个生成器有一个函数就是next函数,next就相当于“下一步”生成哪个数,这一次的next开始的地方是接着上一次的next停止的地方执行的,所以调用next的时候,生成器并不会从foo函数的开始执行,只是接着上一步停止的地方开始,然后遇到yield后,return出要生成的数,此步就结束。

  ****************************************************************************************************************************************

  def foo():

  打印(开始.)

  而True:

  res=收益率4

  打印( res: ,res)

  g=foo()

  打印(下一个(g))

  打印( **20)

  打印(g.send(7))

  看看这个生成器的send函数的另一个例子。此示例替换上面示例的最后一行,并输出结果:

  开始.

  四

  ********************

  res: 7

  四

  先说一下send函数的概念:此时你应该注意到了上面那个紫色的字,为什么上面res的值是None,这个变成了7。为什么?这是因为send给res发了一个参数,因为上面提到了返回的时候,4没有赋给res,所以下次你要继续赋值操作,你要赋给None。如果您使用send,您将开始执行它。

  时候,先接着上一次(return 4之后)执行,先把7赋值给了res,然后执行next的作用,遇见下一回的yield,return出结果后结束。

  5.程序执行g.send(7),程序会从yield关键字那一行继续向下运行,send会把7这个值赋值给res变量

  6.由于send方法中包含next()方法,所以程序会继续向下运行执行print方法,然后再次进入while循环

  7.程序执行再次遇到yield关键字,yield会返回后面的值后,程序再次暂停,直到再次调用next方法或send方法。

  这就结束了,说一下,为什么用这个生成器,是因为如果用List的话,会占用更大的空间,比如说取0,1,2,3,4,5,6............1000

  你可能会这样:

  

for n in range(1000):

   a=n

  这个时候range(1000)就默认生成一个含有1000个数的list了,所以很占内存。

  这个时候你可以用刚才的yield组合成生成器进行实现,也可以用xrange(1000)这个生成器实现

  yield组合:

  

def foo(num):

   print("starting...")

   while num<10:

   num=num+1

   yield num

  for n in foo(0):

   print(n)

  输出:

  

starting...12345678910

  xrange(1000):

  

for n in xrange(1000): a=n

  其中要注意的是python3时已经没有xrange()了,在python3中,range()就是xrange()了,你可以在python3中查看range()的类型,它已经是个<class 'range'>了,而不是一个list了,毕竟这个是需要优化的。

  

总结

  本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注盛行IT软件开发工作室的更多内容!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

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