yield是一個簡單好用但又費解的語句。認真地琢磨了兩天,覺得自己弄明白了。就結合着例子用自己的理解來說說吧。
1.yield相當於“return”+位置信息。yield這個詞本身用的就很巧妙。因爲這個詞“生產”和“停止”兩個意思都有。yield既表示產生返回值,又表示在這個地方停下來,等待下一次循環。就是從yield返回之後開始迭代。關於這一點,必須搞清楚。第一相當於return,第二下次執行該函數時不是從頭再來,而是從停下的地方開始。
def iter1():
print("begining iter1...")
yield 1000
print("go on! iter1.")
s1=iter1()
print(next(s1))
輸出爲:
這裏要注意兩點。一是包含yield的函數就成了特殊的生成器函數。調用這個生成器函數時,函數並不執行,只是構成生成器。
二是要用next()獲得yield返回值。每一個next()只返回一個返回值。如果沒有yield了,則報錯。
例如,如果爲上例再增加一行代碼:
print(next(s1))
系統則會報錯。因爲iter1()函數裏,yield只有一次機會,沒有第二個循環。事實上沒有形成迭代。當然,這裏的yield意義不大。
2.利用for...in迭代。利用yield形成迭代的方法。yield可以記錄位置,但本身不形成迭代。需要通過for...in語句或者while語句,或者列表來完成跌到。
def iter2():
print("begining iter2...")
for i in range(5):
yield i*2
print("go on! iter2")
s2=iter2()
for i in range(5):
print(next(s2))
3.利用while迭代。
def iter3(count):
print("begining iter3:")
while count<10:
yield i*2
print("go on! iter3")
s3=iter3(5)
for i in range(5):
print(next(s3))
4.利用列表迭代
def addlist(alist):
for i in alist:
yield i+1
alist=[1,2,3,4,5]
for x in addlist(alist):
print(x)