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