4

私はコルーチンについて学んでいますが、理解できないほど奇妙に機能します...これがソースです

@coroutine
def printer():
    tmp=(yield)
    print tmp

def sender(coru):
    coru.send("hello")
    print "I'm sender"

if __name__=="__main__":
    coru=printer()
    sender(coru)
    print "I'm master"

ショー

こんにちは

StopItertationError @ coru.send("hello")

その間、

@coroutine
def printer():
          while 1:
               tmp=(yield)
               print tmp

def sender(coru):
    coru.send("hello")
    print "I'm sender"

if __name__=="__main__":
    coru=printer()
    sender(coru)
    print "I'm master"

ショー

こんにちは

私は送信者です

私はマスターです

正しく。

だから私は疑問に思っています

  1. コルーチンが常にループで機能する理由と、最初の例でエラーが発生する理由

  2. バージョン 3.3 で「yield from」構文について聞きました。それは最初のものを機能させるのに役立ちますか?

  3. サブルーチンとは異なり、すべてのコルーチン関数が同等に機能することを私は知っています。

    しかし、その後、Printer 関数が終了した後、Sender に戻らずにプログラムを終了する必要があると思います。

    しかし、そうです。差出人がプリンターよりも優れているということではないですか?サブルーチンとコルーチンの違いは何ですか。

読んでくれてありがとう。教えてくれたら本当にありがたいです:)

4

2 に答える 2

5

ジェネレーター ( などprinter) が終了すると、StopIteration 例外が発生します。

Python の実行時

coru.send("hello")

にジャンプします

tmp = (yield)

に「こんにちは」を割り当てtmpます。次に、次の行を実行します。

print tmp

その後、ジェネレーターが終了し、StopIteration例外が発生します。

一方、 (ループprinterを使用して)終了を許可しない場合、例外は発生しません。代わりに、次の式に到達するまで実行 (in) が続行されます。while 1StopIterationprinteryield

tmp = (yield)

このsendメソッドは、そのyield式の値 (この場合はNone) を返します。この時点で、Python は再びsender関数に戻り、次に実行します

print "I'm sender"

この構文の目的は、ジェネレーター (およびyield fromと共に使用することを意図) をサブジェネレーターにリファクタリングしやすくすることです。PEP380What's New in Python3を参照してください。sendthrow

StopIteration の動作は変更されません。

于 2012-08-06T08:57:37.703 に答える
2

これは、コルーチンの非常に優れた紹介です。

http://www.dabeaz.com/coroutines/

特に、以下をご覧ください。

http://www.dabeaz.com/coroutines/grep.py

および (@coroutine 実装の例) :

http://www.dabeaz.com/coroutines/coroutine.py

于 2012-08-06T09:00:25.813 に答える