国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【generator101】- generator是可以被外部控制執行進度的函數

yacheng / 1407人閱讀

摘要:協程是用來處理阻塞和流程阻塞這兩個普世問題的得力工具,可以達到比較好的。這段代碼執行的輸出是通過這個例子,可以了解到的的兩個特性。被調用一次,函數就往前執行一步。通過控制,可以從外面控制函數內部的執行進度。

很多碼農終其一生可能在代碼上干的事情無非就是追求兩件事情:Logic Locality 和 Data Locality。前者決定了開發效率,后者決定了運行效率。協程是用來處理I/O阻塞和流程阻塞這兩個普世問題的得力工具,可以達到比較好的Logic Locality。

def demo_before_and_after():
    print("before")
    yield
    print("after")

gen = demo_before_and_after()
gen.next()
gen.next()

這段代碼執行的輸出是

gen created
before
after
Traceback (most recent call last):
...
StopIteration

通過這個例子,可以了解到Python的generator的兩個特性。
首先,demo_before_and_after()的時候,before并沒有被打印出來。說明demo_before_and_after這個函數在這個時候還沒有真正開始執行。gen.next()被調用一次,函數就往前執行一步。通過控制gen.next(),可以從外面控制函數內部的執行進度。
其次,Python的generator沒有類似Java的Iterator.hasNext這樣的設計,直接以拋出StopIteration來傳達“到尾巴了”這個消息。

利用generator這個特性,Python的標準庫提供了一個非常方便的contextmanager的設計

import contextlib

@contextlib.contextmanager
def demo_before_and_after():
    print("before")
    yield
    print("after")

with demo_before_and_after():
    print("inside")

輸出結果是

before
inside
after

很多需要獲得資源,使用資源,然后確保資源被正確釋放的場合(類似C++的RAII),都可以用上面的寫法來實現。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37382.html

相關文章

  • generator101】 - generator輸入與輸出

    摘要:的是可以有輸入輸出的,這個特性并不廣為人知。也就是要求不返回值,而是拋出給定的異常。執行之后的輸出與前面是一樣的。 Python的generator是可以有輸入輸出的,這個特性并不廣為人知。這其實是一個挺有用的特性,利用其外部可控制執行進度的特性,再加上可以與外部進行輸入輸出,generator可以被用來打造成一個異步執行框架,或者說是協程調度引擎。 我們先來看一個最簡單的例子,gen...

    melody_lql 評論0 收藏0
  • generator101】 - generator一種顯式控制協程

    摘要:協程其實就是一個可中途中斷,由外部來控制執行進程的函數。這些第三方的選擇的共同特點是協程的都是隱式的。這就是顯示控制和隱式控制的區別。本文討論的協程就是這一種,后面會逐漸展開到如何利用這種顯示控制的協程來解決阻塞和流程阻塞的問題。 Python官方的實現里,協程只有generator這一招。協程其實就是一個可中途中斷,由外部來控制執行進程的函數。除了官方的generator,還有很多第...

    894974231 評論0 收藏0
  • generator101】 - 對比generator和greenlet

    摘要:比如里可以直接把執行權交給,而完全不知情。雖然不能和多線程相比,但是效果是類似的。對于多線程的代碼,是任何一行代碼都可能與其他線程并行。加上協程之間有共享狀態的話,一定程度上會產生類似多線程的并發讀寫狀態的。 前面講generator是顯式的協程的時候缺一個例子,現在補上 def parent_generator(): print(hello) yield from ...

    CoyPan 評論0 收藏0
  • generator101】 - yield from

    摘要:我們可以看一下的可見是由內部支持的,其實現原理上就避免了棧進棧出的消耗,直接由最內層的返回值。另外可以實現外部直接向最內層的傳遞值,比如這段代碼的輸出是這樣傳值的方式,在用循環重新的模式下是無法實現的。這也就是必須使用,而不能使用的原因。 在python 3.3里,generator新增了一個語法 yield from 這個yield from的作用是什么?看下面兩段對比的代碼: d...

    xiaodao 評論0 收藏0
  • 深入理解 Generator 函數

    摘要:同時,迭代器有一個方法來向函數中暫停處拋出一個錯誤,該錯誤依然可以通過函數內部的模塊進行捕獲處理。 本文翻譯自:Diving Deeper With ES6 Generators 由于個人能力有限,翻譯中難免有紕漏和錯誤,望不吝指正issue ES6 Generators:完整系列 The Basics Of ES6 Generators Diving Deeper With E...

    jzzlee 評論0 收藏0

發表評論

0條評論

yacheng

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<