[python]コルディンコルビン

24070 ワード

コルディンって何?


メイン呼び出し関数の場合、関数のコードを実行し、メインに戻ります.関数の内容はすべて消えます.メインプログラムがメインプログラムであり,関数がサブプログラムである場合,サブプログラムはメインプログラムに従属する関係である.
しかし、コルディンのやり方は少し違う.코루틴(corouine)は協力のルーチンであり、相互協力のルーチンを意味する.
すなわち,それらはメインプログラムとサブプログラムのような従属関係ではなく,互いに対等な関係であり,ある時点で相手のコードを実行する.

coutinは、関数が終了していない場合にプライマリスレッドのコードを実行し、coutinのコードを返して実行します.coluceneは終了していないので、coluceneの内容も維持されます.
通常の関数を呼び出すには1回のコードしか実行できませんが、coutineはコードを複数回実行できます.
関数のコード実行点は진입점(entry point)と呼ばれ、coluceneは複数のエントリ点を持つ関数である.

サブルーチンに値を送信


コルディンは発電機の特殊な形式である.発電機の価格はyieldだが、コルディンの価格はyieldだ.
def number_coroutine():
    while True:  # 코루틴을 계속 유지하기 위해 무한 루프 사용
        x = yield  # 코루틴 바깥에서 값을 받아온다
        x += 10
        print(x)


co = number_coroutine()
next(co)  # 코루틴 안의 yield까지 코드 실행(최초 실행)

co.send(1)  # 코루틴에 숫자 1을 보낸다
co.send(2)  # 코루틴에 숫자 1을 보낸다
co.send(3)  # 코루틴에 숫자 1을 보낸다

値をcoutineに送信する場合、codel実行時にはsendメソッドが使用されます.
その後、sendメソッドが値を受け入れるように送信されると、(yield)フォーマットでyieldが括弧で囲まれ、変数に保存される.(高バージョンのPythonでは庇う必要はありません(?)
  • 鼻プログラム内でwhile True:を無限に繰り返し使用し、鼻プログラムを終了させない.
  • スレッドの外にスレッドオブジェクトを作成し、nextを実行すると、コードはyieldに実行されます.
  • の後、sendを使用してコルディンに値を送信する.
  • 整理後,next関数でcoutinのコードを初めて実行し,sendメソッドでcoutinに値を送信するとともに,待機するcoutinのコードを再実行する.
    すなわち、coutineはyieldで関数の間で待機し、メインルーチンを実行し、coutineを再度実行する.

    値をサブルーチンの外に渡す

    def sum_coroutine():
        total = 0  # 바깥으로 보낼값
        while True:
            x = yield total  # 코루틴 바깥에서 값을 받아오면서(x) 바깥으로 값을 전달(total)
            total += x
    
    
    co = sum_coroutine()
    print(next(co))  # 0: 코루틴 안의 yield까지 코드를 실행하고 코루틴에서 나온 값 출력
    
    print(co.send(1))  # 1: 코루틴에 숫자 1을 보내고 코루틴에서 나온 값 출력
    print(co.send(2))  # 2: 코루틴에 숫자 2을 보내고 코루틴에서 나온 값 출력
    print(co.send(3))  # 3: 코루틴에 숫자 3을 보내고 코루틴에서 나온 값 출력

    サードパーティとサードパーティの違い
  • サードパーティは、nextの関数を繰り返し呼び出すことによって値
  • を得る.
  • スレッドは、next関数を1回のみ呼び出し、sendで値
  • を交換する.

    サブルーチン例外の終了と処理

    def number_coroutine():
        try:
            while True:
                x = yield
                print(x, end=" ")
        except GeneratorExit: # 코루틴이 종료 될 때 GeneratorExit 예외 발생
            print()
            print("Finished Coroutine")
    
    
    co = number_coroutine()
    next(co)
    
    for i in range(20):
        co.send(i)
    
    co.close() # 코루틴 종료
    coluceneオブジェクトでcloseメソッドを使用すると、coluceneは終了します.closeメソッドを使用してcoutinを終了すると、GeneratorExitの例外が発生します.この例外を処理するとcoutinの終了時間がわかります.

    鼻ルーチンで異常発生


    coluceneで異常が発生した場合、throwメソッドを使用します.`throwメソッドで指定されたエラーメッセージは、except asの変数に属します.
    def sum_coroutine():
        try:
            total = 0
            while True:
                x = yield
                total += x
        except RuntimeError as e:
            print(e)
            yield total  # 코루틴 바깥으로 값 전달
    
    
    co = sum_coroutine()
    next(co)
    
    for i in range(20):
        co.send(i)
    
    print(co.throw(RuntimeError, "Finished Coroutine with Exception"))
    colucene内でtry exceptRuntimeErrorの例外が発生した場合、printエラーメッセージが出力され、yieldを使用してtotalが外部に伝達される.

    yield from:サブコードインスタンスの戻り値を取得する


    発電機においてyield fromを使用して、値を外部に複数回伝達する.
    ただし、yield fromがcoluceneに指定されている場合、coluceneはreturnを返します.
    def accumulate():
        total = 0
        while True:
            x = yield  # 코루틴 바깥에서 값을 받아온다
            if x is None:  # 받아온 값이 None이면
                return total  # 합계를 반환
            total += x
    
    
    def sum_coroutine():
        while True:
            total = yield from accumulate()  # accumulate의 반환값을 가져옴
            print(total)
    
    
    co = sum_coroutine()
    next(co)
    
    for i in range(1, 11):
        co.send(i)  # 코루틴 accumulate에 숫자를 보낸다
    co.send(None)  # 코루틴 accumulate에 None을 보내서 숫자 누적을 끝냄
    
    for i in range(1, 101):
        co.send(i)  # 코루틴 accumulate에 숫자를 보낸다
    co.send(None)  # 코루틴 accumulate에 None을 보내서 숫자 누적을 끝냄
    
    
    55
    5050
    coluceneでyield fromを使用すると、coluceneの外部からsendサブcoluceneに値を送信することができる.

    コルディンの生産量から


    coluceneで値yieldを指定して外部に渡すと、yield from は値を再び外部に渡します.
    def number_coroutine():
        x = None
        while True:
            x = yield x  # 코루틴 바깥에서 값을 받아오면서 바깥으로 값을 전달
            if x == 3:
                return x
    
    
    def print_coroutine():
        while True:
            x = yield from number_coroutine()  # 하위 코루틴의 yield에 지정된 값을 다시 바깥으로 전달
            print("print_coroutine: ", x)
    
    
    co = print_coroutine()
    next(co)
    
    x = co.send(1)  # number_coroutine으로 1을 보낸다
    print(x)  # 1: number_corouine의 yield에서 바깥으로 전달한 값
    x = co.send(2)  # number_coroutine으로 1을 보낸다
    print(x)  # 2: number_corouine의 yield에서 바깥으로 전달한 값
    co.send(3)  # 3을 보내서 반환값을 출력하도록 만든다
    
    
    1
    2
    print_coroutine: 3
    

    例1-文字列検索鼻ルーチンの作成

    ## 문자열 검색 코루틴 만들기
    def find(word):
        result = False
        while True:
            line = yield result
            result = word in line
    
    
    f = find("Python")
    next(f)
    
    print(f.send("Hello, Python!"))
    print(f.send("Hello, world!"))
    print(f.send("Python Script!"))
    
    f.close()
    
    

    例2-4則演算子

    ## 사칙 연산 코루틴
    def calc():
        result = 0
        while True:
            expression = yield result
            a, operator, b = expression.split()
            if operator == "+":
                result = int(a) + int(b)
            elif operator == "-":
                result = int(a) - int(b)
            elif operator == "*":
                result = int(a) * int(b)
            elif operator == "/":
                result = int(a) / int(b)
    
    
    expressions = input().split(", ")
    
    c = calc()
    next(c)
    
    for e in expressions:
        print(c.send(e))
    
    c.close()
    
    

    参考資料

  • Pythonコード印鑑