91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

yield關鍵字在Python中的作用是什么

發布時間:2021-01-21 16:33:55 來源:億速云 閱讀:198 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關yield關鍵字在Python中的作用是什么,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

  • 通常的for...in...循環中,in后面是一個數組,這個數組就是一個可迭代對象,類似的還有鏈表,字符串,文件。它可以是mylist = [1, 2, 3],也可以是mylist = [x*x for x in range(3)]。它的缺陷是所有數據都在內存中,如果有海量數據的話將會非常耗內存。

  • 生成器是可以迭代的,但只可以讀取它一次。因為用的時候才生成。比如 mygenerator = (x*x for x in range(3)),注意這里用到了(),它就不是數組,而上面的例子是[]。

  • 我理解的生成器(generator)能夠迭代的關鍵是它有一個next()方法,工作原理就是通過重復調用next()方法,直到捕獲一個異常。可以用上面的mygenerator測試。

  • 帶有 yield 的函數不再是一個普通函數,而是一個生成器generator,可用于迭代,工作原理同上。

  • yield 是一個類似 return 的關鍵字,迭代一次遇到yield時就返回yield后面(右邊)的值。重點是:下一次迭代時,從上一次迭代遇到的yield后面的代碼(下一行)開始執行。

  • 簡要理解:yield就是 return 返回一個值,并且記住這個返回的位置,下次迭代就從這個位置后(下一行)開始。

  • 帶有yield的函數不僅僅只用于for循環中,而且可用于某個函數的參數,只要這個函數的參數允許迭代參數。比如array.extend函數,它的原型是array.extend(iterable)。

  • send(msg)與next()的區別在于send可以傳遞參數給yield表達式,這時傳遞的參數會作為yield表達式的值,而yield的參數是返回給調用者的值。——換句話說,就是send可以強行修改上一個yield表達式值。比如函數中有一個yield賦值,a = yield 5,第一次迭代到這里會返回5,a還沒有賦值。第二次迭代時,使用.send(10),那么,就是強行修改yield 5表達式的值為10,本來是5的,那么a=10

  • send(msg)與next()都有返回值,它們的返回值是當前迭代遇到yield時,yield后面表達式的值,其實就是當前迭代中yield后面的參數。

  • 第一次調用時必須先next()或send(None),否則會報錯,send后之所以為None是因為這時候沒有上一個yield(根據第8條)。可以認為,next()等同于send(None)。

代碼示例1:

#encoding:UTF-8 
def yield_test(n): 
  for i in range(n): 
    yield call(i) 
    print("i=",i) 
  #做一些其它的事情   
  print("do something.")   
  print("end.") 
def call(i): 
  return i*2 
#使用for循環 
for i in yield_test(5): 
  print(i,",")

結果是:

>>>  
0 , 
i= 0 
2 , 
i= 1 
4 , 
i= 2 
6 , 
i= 3 
8 , 
i= 4 
do something. 
end. 
>>>

理解的關鍵在于:下次迭代時,代碼從yield的下一跳語句開始執行。

代碼示例2:

def node._get_child_candidates(self, distance, min_dist, max_dist):
  if self._leftchild and distance - max_dist < self._median:
    yield self._leftchild
  if self._rightchild and distance + max_dist >= self._median:
    yield self._rightchild

與前面不同的是,這個函數中沒有for循環,但它依然可以用于迭代。

node._get_child_candidates函數中有yield,所以它變成了一個迭代器,可以用于迭代。

執行第一次迭代時(其實就是調用next()方法),如果有左節點并且距離滿足要求,會執行第一個yield,這時會返回self._leftchild并完成第一個迭代。

執行第二次迭代時,從第一個yield后面開始,如果有右節點并且距離滿足要求,會執行第二個yield,這時會返回self._rightchild并完成第一個迭代。

執行第三次迭代時,第二個yield后再無代碼,捕獲異常,退出迭代。

調用過程:

result, candidates = list(), [self]
while candidates:
  node = candidates.pop()
  distance = node._get_dist(obj)
  if distance <= max_dist and distance >= min_dist:
    result.extend(node._values)
  candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))
return result

上面的node._get_child_candidates(self, distance, min_dist, max_dist)是放在extend()函數中作為參數的,為什么可以這么用,就因為extend函數的參數不僅僅支持array,只要它是一個迭代器就可以。它的原型是array.extend(iterable)。

代碼示例3:

yield關鍵字在Python中的作用是什么

關于yield關鍵字在Python中的作用是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

余干县| 淮阳县| 疏附县| 垦利县| 彭山县| 乐都县| 温宿县| 瑞丽市| 万山特区| 萨嘎县| 伊宁市| 凯里市| 灵寿县| 辰溪县| 西乌珠穆沁旗| 峨山| 永丰县| 太白县| 吉木乃县| 东莞市| 甘德县| 木里| 遂昌县| 盐津县| 时尚| 武定县| 札达县| 台南市| 长宁县| 鹰潭市| 乌什县| 峨眉山市| 韶关市| 定南县| 和林格尔县| 江山市| 长阳| 栾川县| 鄂尔多斯市| 交城县| 蒙阴县|