參考鏈接: 什么時候在Python中使用yield而不是return
python中的yield功能比較強大,什么意思呢?如果一個函數f內使用了yield關鍵詞,那么該函數就可以這樣使用:?
for item in f(***):
? ? ****
?
也就是包含yield關鍵詞的函數可以在for循環中迭代,說到迭代第一印象是包含很多個元素才可以迭代,確實如此。舉個更加詳細的案例: 需求::?
你需要產生一個按照特定規則增減的序列,比如最簡單的遞增序列:1,2,3…1000000,第一印象是可以把產生號的序列放到list中,使用的時候直接取值就好,但是這種做法有個致命的缺點,即需要預先存儲這些序列,這會耗費大量的內存,那么有沒有更好的方法呢??
這是yield出來拯救世界了:?
def getSeq(num):
? ? index = 1;
? ? while index<num:
? ? ? ?yield index
? ? ? ? index = index+1
?
調用方法:?
for i in getSeq(1000000):
? ? pass
?
上述代碼運行時,for中調用了getSeq,執行該函數時,遇到yield index時會將index的值返回,并且函數暫停在yield語句的位置,下次再調用getSequence時,將繼續從上次暫停的位置開始運行,直到遇到yield關鍵詞時又將index的值返回,一直這樣循環?
yield的作用也就是:當執行到yield關鍵詞的代碼時,函數會暫時返回,下次調用該函數時,會從上次暫停的地方繼續運行,yield起到一個暫時返回的作用,有點像return。?
另外,yield其實可以有返回值,也可以從外界改變yield的返回值:?
def getSeq(num):
? ? index = 1
? ? while index<num:
? ? ? ? res = yield index
? ? ? ? print('res = '+str(res)+'\n')
? ? ? ? index = index+1
for i in getSeq(3):
? ? print('i = '+str(i)+'\n')
?
輸出:?
?
?i=1 res = None i = 2 res = None?
?
上面打印出的res取值都是None,yield將index的值返回給調用方后,res賦的值為None,但是我們也可以從外界手動給res賦值?
def getSeq(num):
? ? index = 1
? ? while index<num:
? ? ? ? res = yield index
? ? ? ? print('res = '+str(res)+'\n')
? ? ? ? index = index+1
seq = getSeq(5)#
next(seq)
seq.send(1)
seq.send(2)
seq.send(3)
?
輸出:?
?
?res=1 res=2 res=3?
?
上述代碼先調用next(seq)主要是使getSeq函數暫停到yield語句的地方,暫停在yield語句后才能使用send方法給yield返回值賦值,否則會報錯。?
上述大概是yield關鍵詞的使用,總結:?
在執行seq = getSeq(5)的時候,函數并沒有執行,此時seq的類型是對象,更具體一點seq是生成器類型(generator)每個generator類型對象主要有兩個方法:send和next,next用來迭代,send用來給yield返回值賦值,默認情況下yield的返回值是None每一個send方法中隱式調用了next方法send方法是給yield表達式返回值賦值,所以函數必須暫停在yield代碼處的時候才能調用send方法(其實就是調用send方法前至少調用一次next方法)for i in getSeq 其實就是對generator進行迭代,和next方法類似?
?
掃描下方二維碼,及時獲取更多互聯網求職面經、java、python、爬蟲、大數據等技術,和海量資料分享:公眾號后臺回復“csdn”即可免費領取【csdn】和【百度文庫】下載服務;公眾號后臺回復“資料”:即可領取5T精品學習資料、java面試考點和java面經總結,以及幾十個java、大數據項目,資料很全,你想找的幾乎都有