sunrise

每天不断学习,才能不断提升自己。

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  64 随笔 :: 0 文章 :: 92 评论 :: 0 Trackbacks
http://www.pythonclub.org/python-basic/yield

yield 用法说明

yield 简单说来就是一个生成器生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。

  • 生成器 是 一个函数

函数的所有参数都会保留

  • 第二次调用 此函数 时

使用的参数是前一次保留下的.

  • 生成器还“记住”了它在流控制构造

生成器不仅“记住”了它数据状态。 生成器还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。由于连续性使您在执行框架间任意跳转,而不总是返回到直接调用者的上下文(如同生成器那样),因此它仍是比较一般的。

yield 生成器的运行机制

当你问生成器要一个数时,生成器会执行,直至出现 yield 语句,生成器把 yield 的参数给你,之后生成器就不会往下继续运行。 当你问他要下一个数时,它会从上次的状态开始运行,直至出现yield语句,把参数给你,之后停下。如此反复直至退出函数。

下面借助几个例子来理解yield:
例1 yield的应用:
def addlist(alist):
    
for i in alist:
       
yield i+2
alist 
= [1,2,3,4]
for x in addlist(alist):
    
#对alist的每个list数据进行i+2操作
    print x
输出结果:

3
4
5
6

例2.next的应用:
def h():
print 'hello'
yield 5
print 'word'

c
= h()
#执行到yield处
c.next()
print 'flag'
#因为后面没有yield了,而导致程序出错
c.next()

输出结果:
hello
flag
word
Traceback (most recent call last):
File
"test.py", line 9, in <module>
c.next()
StopIteration

例3.next和send的不同
#coding:utf8
def h():
print 'hello'
m
= yield 5
print m
d
= yield 12
print 'word'


c
= h()
#c.next()相当于c.send(None)
c.next()
print 'flag'
#(yield 5)被赋值了,yield接收了send的值
c.send('!')
例4.next和send的返回值
#coding:utf8
def h():
print 'hello'
m
= yield 5
print m
d
= yield 12
print 'word'


m
= c.next()
print 'flag'
d
= c.send('!')
#m,d的值为5,12可见send和next的返回值就是yield的参数
print m,d












posted on 2012-12-27 12:04 SunRise_at 阅读(1757) 评论(0)  编辑 收藏 引用 所属分类: 可爱的python

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理