python(4)yield函数

这个函数据说叫做函数发生器,看文档也没看明白,后来在网上看了一个用法,发现实际上相当于return 语句,如下代码:

 
def addlist(alist):
    for i in alist:
        yield i + 1

取出alist的每一项,然后把i + 1塞进去。然后通过调用取出每一项:

alist = [1, 2, 3, 4]
for x in addlist(alist):
    print x,

结果为:2 3 4 5

这个调用非常清晰,每到yield i + 1就相当于return i + 1,即执行到这儿,此函数就结束了,有了前面基本的认识,对于后面较高级用法有很大的作用。

 

较高级用法:

原先的yield是作为一条语句使用,现在可将之作为表达式使用。

def g():
    a0 = 'first'
    print 'step a0', 'a0= ', a0
    a1 = yield a0 + ‘_myadd’
    print 'step a1', 'a1 = ', a1
    a2 = yield a1
    print 'step a2', 'a2 = ', a2
f = g()
f.next()
f.send('x1')
f.send('x2')

返回如下结果:

step a0 a0=  first
'first'
step a1 a1 =  x1
'x1'
step a2 a2 =  x2

Traceback (most recent call last):
  File "<pyshell#133>", line 1, in <module>
    f.send('x2')
StopIteration

简单解释,前面说到yield相当于return,

调用f.next()时,执行到yield a0,函数挂起,函数值为‘first_myadd’

调用f.send(‘x1’),将表达式yield a0赋值为'x1’,并赋给a1,执行到yield a1,函数挂起,函数值为’x1’

调用f.send(‘x2’),将表达式yield a1赋值为‘x2’,并赋给a2,打印完成后发现没有yield使其挂起,引发异常

注意,yield表达式值和函数值是不同的概念,像a1, a2通过=获取的皆为yield表达式值,它们是通过f.send(x)传递进来的,而类似

yield a0 + ‘myadd’,则是函数挂起时的值。

posted @ 2012-04-02 11:40  绿色的麦田  阅读(339)  评论(0编辑  收藏  举报