Python中的yield详解
閱讀別人的python源碼時碰到了這個yield這個關(guān)鍵字,各種搜索終于搞懂了,在此做一下總結(jié):
它的缺陷是所有數(shù)據(jù)都在內(nèi)存中,如果有海量數(shù)據(jù)的話將會非常耗內(nèi)存。
代碼示例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循環(huán) for i in yield_test(5): print(i,",")結(jié)果是:
>>> 0 , i= 0 2 , i= 1 4 , i= 2 6 , i= 3 8 , i= 4 do something. end. >>>理解的關(guān)鍵在于:下次迭代時,代碼從yield的下一跳語句開始執(zhí)行。
代碼示例2:
def node._get_child_candidates(self, distance, min_dist, max_dist):if self._leftchild and distance - max_dist < self._median:yield self._leftchildif self._rightchild and distance + max_dist >= self._median:yield self._rightchild與前面不同的是,這個函數(shù)中沒有for循環(huán),但它依然可以用于迭代。
node._get_child_candidates函數(shù)中有yield,所以它變成了一個迭代器,可以用于迭代。
執(zhí)行第一次迭代時(其實就是調(diào)用next()方法),如果有左節(jié)點并且距離滿足要求,會執(zhí)行第一個yield,這時會返回self._leftchild并完成第一個迭代。
執(zhí)行第二次迭代時,從第一個yield后面開始,如果有右節(jié)點并且距離滿足要求,會執(zhí)行第二個yield,這時會返回self._rightchild并完成第一個迭代。
執(zhí)行第三次迭代時,第二個yield后再無代碼,捕獲異常,退出迭代。
調(diào)用過程:
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()函數(shù)中作為參數(shù)的,為什么可以這么用,就因為extend函數(shù)的參數(shù)不僅僅支持array,只要它是一個迭代器就可以。它的原型是array.extend(iterable)。
作者:千若逸
鏈接:https://www.jianshu.com/p/d09778f4e055
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
總結(jié)
以上是生活随笔為你收集整理的Python中的yield详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python中的虚拟环境-virtual
- 下一篇: python中关于深拷贝和浅拷贝的详解