Python yield生成器的send方法考察

众所周知生成器是用来处理迭代的,而send方法用来提供生成器和外部交互的手段。在python基础语法中这一部分不是很好理解。本文对这个方法做了考察。
生成器在运行到yield方法时,程序会挂起,等待下一次迭代,而唤醒程序可以用next,也可以用send。在《python基础教程》中是这么说的:当生成器重新运行时,yield返回通过send发送的值。如果next方法被使用,那么yield方法返回None。
可以这么理解。当生成器执行到yield时挂起,生成器会向外部返回一个值,但yield方法不会返回值。如果对生成器使用next方法或send方法,程序都会被唤醒。不同的是next方法会使yield返回None,而send方法会使得yield返回send发送的值。下面几段代码详细说明。

>>> def repeater(value):
while True:
print 'stop'
new=(yield value)
print 'restart'
if new is not None:
value=new
print 'value'+repr(value)

>>> r=repeater(r)
>>> r=repeater(42)
>>> r.next()
stop
42
>>> r.next()
restart
value42
stop
42
>>> r.send('fx')
restart
value'fx'
stop
'fx'

可以看到调用send之前yield就抛出了值42.调用send后new被置为字符串,因此if代码块被执行了。之后value被置为字符串,进入下一层循环后yield返回了该字符串。另外再调用next生成器也会返回该字符串了。
另一段程序
>>> def repeater(value):
while True:
print 'stop'
new=(yield value)
print 'restart'

>>> r=repeater(42)
>>> r.next()
stop
42
>>> r.next()
restart
stop
42
>>> r.send('x')
restart
stop
42
这里生成器捕获send发来的字符串,但没有进行任何处理。因此这里使用send还是next都是一样的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值