[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 except
、RuntimeError
の例外が発生した場合、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()
参考資料
Reference
この問題について([python]コルディンコルビン), 我々は、より多くの情報をここで見つけました https://velog.io/@t1won/Python-코루틴-coroutineテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol