基于Python中的yield表达式介绍
python生成器
python中生成器是迭代器的一种,使用yield返回函数值。每次调用yield会暂停,而可以使用next()函数和send()函数可以恢复生成器。
这里可以参考Python函数式编程指南:对生成器全面讲解
注意到yield是个表达式而不仅仅是个语句,所以可以使用x=yieldr这样的语法。
这个知识点在协程中需要使用。协程的概念指的是在一个线程内,一个程序中断去执行另一个程序,有点类似于CPU中断。这样减少了切换线程带来的负担,同时不需要多线程中的锁机制,因为不存在同时写的问题。
python使用生成器来实现协程,下面看一个python协程应用于生产者消费者问题的例子
defconsumer(): r='yield' whileTrue: #当下边语句执行时,先执行yieldr,然后consumer暂停,此时赋值运算还未进行 #等到producer调用send()时,send()的参数作为yieldr表达式的值赋给等号左边 n=yieldr#yield表达式可以接收send()发出的参数 ifnotn: return print('[CONSUMER]Consuming%s...'%n) r='200OK' defproduce(c): c.send(None) n=0 whilen<5: n=n+1 print('[PRODUCER]Producing%s...'%n) r=c.send(n)#调用consumer生成器 print('[PRODUCER]Consumerreturn:%s'%r) c.close() c=consumer() produce(c)
注意到send需要先调用send(None),因为只有生成器是暂停状态才可以接收send的参数。
为了理解send()恢复生成器的过程,我们可以再看一个例子:
defgen(): a=yield1 print('yielda%s'%a) b=yield2 print('yieldb%s'%b) c=yield3 print('yieldc%s'%c) r=gen() x=next(r) print('nextx%s'%x) y=r.send(10) print('nexty%s'%y) z=next(r) print('nextz%s'%z)
可以看到实际上y=r.send(10)的参数10是赋给了a。整个运行过程即执行x=next(r)之后,gen()执行了yield1然后暂停,没有进行对a的赋值。但再调用y=r.send(10)时赋值过程继续,并把10赋给了a.
以上这篇基于Python中的yield表达式介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。