這個函資料說叫做函數發生器,看文檔也沒看明白,後來在網上看了一個用法,發現實際上相當於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’,則是函數掛起時的值。