日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python中的yield详解

發(fā)布時間:2023/12/20 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python中的yield详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

閱讀別人的python源碼時碰到了這個yield這個關(guān)鍵字,各種搜索終于搞懂了,在此做一下總結(jié):

  • 通常的for…in…循環(huán)中,in后面是一個數(shù)組,這個數(shù)組就是一個可迭代對象,類似的還有鏈表,字符串,文件。它可以是mylist = [1, 2, 3],也可以是mylist = [x*x for x in range(3)]。
    它的缺陷是所有數(shù)據(jù)都在內(nèi)存中,如果有海量數(shù)據(jù)的話將會非常耗內(nèi)存。
  • 生成器是可以迭代的,但只可以讀取它一次。因為用的時候才生成。比如 mygenerator = (x*x for x in range(3)),注意這里用到了(),它就不是數(shù)組,而上面的例子是[]。
  • 我理解的生成器(generator)能夠迭代的關(guān)鍵是它有一個next()方法,工作原理就是通過重復調(diào)用next()方法,直到捕獲一個異常??梢杂蒙厦娴膍ygenerator測試。
  • 帶有 yield 的函數(shù)不再是一個普通函數(shù),而是一個生成器generator,可用于迭代,工作原理同上。
  • yield 是一個類似 return 的關(guān)鍵字,迭代一次遇到y(tǒng)ield時就返回yield后面(右邊)的值。重點是:下一次迭代時,從上一次迭代遇到的yield后面的代碼(下一行)開始執(zhí)行。
  • 簡要理解:yield就是 return 返回一個值,并且記住這個返回的位置,下次迭代就從這個位置后(下一行)開始。
  • 帶有yield的函數(shù)不僅僅只用于for循環(huán)中,而且可用于某個函數(shù)的參數(shù),只要這個函數(shù)的參數(shù)允許迭代參數(shù)。比如array.extend函數(shù),它的原型是array.extend(iterable)。
  • send(msg)與next()的區(qū)別在于send可以傳遞參數(shù)給yield表達式,這時傳遞的參數(shù)會作為yield表達式的值,而yield的參數(shù)是返回給調(diào)用者的值?!獡Q句話說,就是send可以強行修改上一個yield表達式值。比如函數(shù)中有一個yield賦值,a = yield 5,第一次迭代到這里會返回5,a還沒有賦值。第二次迭代時,使用.send(10),那么,就是強行修改yield 5表達式的值為10,本來是5的,那么a=10
  • send(msg)與next()都有返回值,它們的返回值是當前迭代遇到y(tǒng)ield時,yield后面表達式的值,其實就是當前迭代中yield后面的參數(shù)。
  • 第一次調(diào)用時必須先next()或send(None),否則會報錯,send后之所以為None是因為這時候沒有上一個yield(根據(jù)第8條)??梢哉J為,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循環(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。