Python 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  www.2cto.com
Traceback (most recent call last):
 File "test.py", line 9, in <module>
 c.next() www.2cto.com
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
 
 
 
 
 
 

相关内容

    暂无相关文章

评论关闭