Python ジェネレーター コルーチンの操作を例とともに詳しく説明します

巴扎黑
リリース: 2017-09-05 11:11:20
オリジナル
1193 人が閲覧しました

次のエディターは、Python ジェネレーター コルーチン操作の例を示します。編集者はこれがとても良いものだと思ったので、皆さんの参考として今から共有します。エディターをフォローして見てみましょう

1. Yield の操作方法

次のようにジェネレーターを定義します:


def put_on(name):
 print("Hi {}, 货物来了,准备搬到仓库!".format(name))
 while True:
  goods = yield
  print("货物[%s]已经被%s搬进仓库了。"%(goods,name))
 
p = put_on("bigberg")
 
#输出
G:\python\install\python.exe G:/python/untitled/study4/test/double.py
 
Process finished with exit code 0
ログイン後にコピー

yield を通じて関数をジェネレーターに変換するとき、それを直接実行します。結果を返さないでください。この時点では関数はすでにジェネレーターであるため、next() を通じて値を取得し、yield が発生したときに再び関数から抜け出す必要があります。


print(type(p))
 
#输出
<class &#39;generator&#39;>
ログイン後にコピー

next() メソッドを追加します。


def put_on(name):
 print("Hi {}, 货物来了,准备搬到仓库!".format(name))
 while True:
  goods = yield  #遇到yield中断
  print("货物[%s]已经被%s搬进仓库了。"%(goods,name)) #中断后运行部分
 
p = put_on("bigberg")
p.__next__()
 
#输出
Hi bigberg, 货物来了,准备搬到仓库!
ログイン後にコピー

この時点で、関数は Goods = yield で中断されます。 next() 関数を再度呼び出すと、関数はコンテンツのみを実行します。中断後、つまり上記の例では収量の低い部分です。

別の next():


def put_on(name):
 print("Hi {}, 货物来了,准备搬到仓库!".format(name))
 while True:
  goods = yield
  print("货物[%s]已经被%s搬进仓库了。"%(goods,name))
 
p = put_on("bigberg")
p.__next__()
p.__next__()
 
#输出
Hi bigberg, 货物来了,准备搬到仓库!
货物[None]已经被bigberg搬进仓库了。
ログイン後にコピー

yield のコンテンツの一部に対して 2 回目の next() を実行できますが、値は商品に渡されないため、商品は None になります。

概要:

yield を通じて関数をジェネレーターに変換します。実行するには next() メソッドを使用する必要があります

yield は関数の割り込みステータスを保持するだけで、 next() を再度呼び出すと、 yield の後の部分

yield が値を返さない場合は、None の空の値を返します

2. Send() は値を渡します


def put_on(name):
 print("Hi {}, 货物来了,准备搬到仓库!".format(name))
 while True:
  goods = yield
  print("货物[%s]已经被%s搬进仓库了。"%(goods,name))
 
p = put_on("bigberg")
p.__next__()
p.send("瓜子")
 
#输出
Hi bigberg, 货物来了,准备搬到仓库!
货物[瓜子]已经被bigberg搬进仓库了。
ログイン後にコピー

概要:

__next__ () はこの yield を呼び出すだけです。または、yield を呼び出すことができますが、yield に値を渡しません。

send() メソッドは yield を呼び出し、yield に値を渡すことができます

send() 関数を使用する前に __next__() を使用する必要があります。これは最初に中断する必要があり、中断された場合にのみ値を渡すことができるためです。 2回目に電話した。


def put_on(name):
 print("Hi {}, 货物来了,准备搬到仓库!".format(name))
 while True:
  goods = yield
  print("货物[%s]已经被%s搬进仓库了。"%(goods,name))
 
p = put_on("bigberg")
p.__next__()
p.send("瓜子")
p.send("花生")
p.send("饼干")
p.send("牛奶")
 
#多次调用send()
Hi bigberg, 货物来了,准备搬到仓库!
货物[瓜子]已经被bigberg搬进仓库了。
货物[花生]已经被bigberg搬进仓库了。
货物[饼干]已经被bigberg搬进仓库了。
货物[牛奶]已经被bigberg搬进仓库了。
ログイン後にコピー

3. 並列効果を実現する単一スレッド (コルーチン)


import time
 
 
def put_on(name):
 print("Hi {}, 货物来了,准备搬到仓库!".format(name))
 while True:
  goods = yield
  print("货物[%s]已经被%s搬进仓库了。"%(goods,name))
 
 
def transfer(name):
 p = put_on(&#39;A&#39;)
 p2 = put_on(&#39;B&#39;)
 p.__next__()
 p2.__next__()
 print("%s将货物送来了!"%name)
 for i in range(5):
  time.sleep(1)
  print("%s递过来两件货物"%name)
  p.send("瓜子")
  p2.send("花生")
 
transfer("bigberg")
 
#输出
Hi A, 货物来了,准备搬到仓库!
Hi B, 货物来了,准备搬到仓库!
bigberg将货物送来了!
bigberg递过来两件货物
货物[瓜子]已经被A搬进仓库了。
货物[花生]已经被B搬进仓库了。
bigberg递过来两件货物
货物[瓜子]已经被A搬进仓库了。
货物[花生]已经被B搬进仓库了。
bigberg递过来两件货物
货物[瓜子]已经被A搬进仓库了。
货物[花生]已经被B搬进仓库了。
bigberg递过来两件货物
货物[瓜子]已经被A搬进仓库了。
货物[花生]已经被B搬进仓库了。
bigberg递过来两件货物
货物[瓜子]已经被A搬进仓库了。
货物[花生]已经被B搬进仓库了。
ログイン後にコピー

以上がPython ジェネレーター コルーチンの操作を例とともに詳しく説明しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート