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’,则是函数挂起时的值。