python中yield的工作原理及迭代方法例解

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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章