注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

snoopyxdy的博客

https://github.com/DoubleSpout

 
 
 

日志

 
 

Python中的yield,next和send  

2014-07-22 15:00:14|  分类: python |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
当定义的方法和函数中有 yield 关键字,这个执行这个函数或者方法就将返回一个生成器对象,这个生成器对象可以被for循环迭代,也可以手动执行next或者send方法精准控制这个生成器的内部执行,我们看如下代码就可以简单理解 yield,next和send之间的关系和用法:

#!/usr/bin/env python
import types

def gen():
print 'enter'
a = yield 1 #StateA
print 'next'
print a or 'a'
b = yield 2 #StateB
print b or 'b'
print 'next again'

g = gen()
print(type(g))
print('g isinstance types.GeneratorTyp : '+ str(isinstance(g, types.GeneratorType)))
print(g.next())

i=0
while(i>=0):
i += 1
print 'i:'+str(i)
try:
print(g.send('x'))
except StopIteration:
break

print('--------------')

g2 = gen()
print(type(g2))

for x in g2:
print(x)


执行上述代码将打印如下信息:

<type 'generator'>
g isinstance types.GeneratorTyp : True
enter
1
i:1
next
x
2
i:2
x
next again
--------------
<type 'generator'>
enter
1
next
a
2
b
next again


详细解释一下执行过程
1、定义生成器函数

def gen()

2、获得迭代器对象,并赋值给g,同时我们打印g的类型,返回generator,可以看到我们类型判断为 generator

g = gen()

3、执行迭代器到到第一个yield处,此处打印1,然后迭代器就挂起了,等待下一次调用,我们暂时命名此出挂起状态为StateA。

print(g.next())

4、进入while循环,第一次执行循环,打印“i:1”,然后执行如下代码

print(g.send('x'))

上述代码将继续 StateA 状态开始执行,首先将字符串“x”发送到迭代器中,然后迭代器开始运行,将字符串“x”复制给变量a,然后打印出:

print 'next' #next print a or 'a' #x

接着运行到下一个 yield,返回yield值“2”到send函数,于是在while循环中就打印出了“2”,这时迭代器函数的状态运行到StateB
5、再次进入while循环,send函数将字符串“x”传递进迭代器,赋值给b,这样迭代器就打印出

print b or 'b' #x
print 'next again' #next again

然后由于迭代器中没有 yield 操作,将抛出一个 StopIteration 异常,我们接受到 StopIteration 异常就终止循环。
6、通过使用for循环来迭代一个迭代器对象更简单,不需要判断 StopIteration 异常就可以获取yield传出来的值,直接将其打印出





  评论这张
 
阅读(807)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016