英语单词“产量”的意思是“生产”。刚接触Python的时候,很迷茫,一直不理解yield的用法。
只要大致知道yield可以用来为一个函数返回值plug数据,比如下面的例子:
默认列表(列表):
fori inalist:
yieldi +1
把单子上的每一项都拿出来,然后把i+1放进去。然后通过呼叫取出每个项目:
ist =[1,2,3,4]
forx inaddlist(列表):
打印x,
这确实是产量应用的一个例子
1.包含产量的函数
如果看到一个函数包含yield,说明这个函数已经是一个Generator了,它的执行会和其他普通函数不一样。例如,以下简单函数:
defh:
打印“勇敢”
产量5
h
可以看到调用h后,print语句没有执行!这就是收益率,那么,如何让print语句执行呢?这是后面要讨论的问题。经过讨论和研究,我们就明白了屈服的工作原理。
2.产量是一种表达方式
在Python2.5之前,yield是一个语句,但现在在2.5中,yield是一个表达式,例如:
m =产量5
表达式(yield 5)的返回值会赋给m,所以认为m = 5是错误的。那么如何得到(收益率5)的返回值呢?需要Send(msg),后面会介绍。
3.通过下一句话来看原理
现在,让我们揭示收益率是如何工作的。我们知道,上面的h在被调用后是不执行的,因为它有一个yield表达式,所以我们让它通过下一条语句执行。下一条语句将继续生成器的执行,直到下一个yield表达式。例如:
defh:
打印“01”
产量5
打印' 02!'
c =h
c .下一步
C.在c.next调用之后,h开始执行,直到产生5:
当我们再次调用c.next时,我们将继续执行,直到找到下一个yield表达式。因为背后没有屈服,所以会抛出异常:
追溯(最近一次通话持续时间):
文件"/home/test/yield.py ",第11行,in & lt模块>
c .下一步
停止迭代
4.发送(消息)和下一个
在理解了下一步如何让包含yield的函数执行之后,让我们看看另一个非常重要的函数,send(msg)。其实next和send在某种意义上有类似的功能。区别在于send可以传入yield表达式的值,而next不能传入特定的值,只能传入None。因此,我们可以看到
C.next和c.send(None)功能相同。
请看这个例子:
defh:
打印' 01 ',
m =yield5 # 02!
打印m
d =产量12
印刷‘我们在一起!'
c =h
C.next #相当于c.send(无)
c.send('02!')#(产量5)表达式被赋给' 02!'
需要提醒的是,第一次通话时,请使用下一条语句或发送(None)。不能用send发送非None值,否则会出错,因为没有接收该值的yield语句。
5.发送(消息)和下一个的返回值
Send(msg)和next都有返回值,而且它们的返回值非常特殊,都是返回下一个yield表达式的参数。例如,收益率5,它返回5。过来,你懂什么吗?在本文的第一个例子中,遍历列表中的生成器实际上是调用列表。下一次每次,和list的返回值。接下来每一次都只是收益率的参数,也就是我们开始认为的被推入。让我们继续上面的例子:
一个
2
三
四
五
六
七
八
九
10
defh:
印刷《文传》,
m =屈服5 #战斗!
printm
d =产量12
打印“我们在一起!”
c =h
M =c .下一个#m获取产量5的参数值5
d =c.send('战斗!')#d获取产量12的参数值12
打印'我们永远不会忘记日期',m,'。,d
输出结果:
一个
2
文川格斗!
我们永远不会忘记日期。12
6.抛出并关闭中断发生器
中断生成器是一种非常灵活的技术,它可以通过抛出GeneratorExit异常来终止生成器。Close方法的作用是一样的,其实它内部调用的是throw(GeneratorExit)。让我们看看:
一个
2
三
四
五
六
七
八
defclose(自):
尝试:
self.throw(GeneratorExit)
除了(生成退出,停止迭代):
通过
else:
raiseRuntimeError("发电机忽略发电机退出")
#没有捕捉到其他异常
因此,当我们调用close方法,然后调用next或send(msg)时,将引发异常:
一个
2
三
四
追溯(最近一次通话持续时间):
文件"/home/evergreen/Codes/yild . py ",第14行,in & lt模块>
d = c.send('战斗!')#d获取产量12的参数值12
停止迭代
1.《yield 深入理解yield》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《yield 深入理解yield》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/fangchan/1495814.html