Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung des Coroutine-Betriebs des Python-Generators anhand von Beispielen

Detaillierte Erläuterung des Coroutine-Betriebs des Python-Generators anhand von Beispielen

巴扎黑
巴扎黑Original
2017-09-05 11:11:201139Durchsuche

Der folgende Editor zeigt Ihnen ein Beispiel für den Coroutine-Betrieb des Python-Generators. Der Herausgeber findet es ziemlich gut, deshalb teile ich es jetzt mit Ihnen und gebe es als Referenz. Folgen wir dem Editor und werfen wir einen Blick darauf >

Wenn wir eine Funktion über yield in einen Generator umwandeln, wird beim direkten Ausführen der Funktion kein Ergebnis zurückgegeben. Da die Funktion zu diesem Zeitpunkt bereits ein Generator ist, müssen wir den Wert über next() abrufen und bei Yield wieder aus der Funktion springen.


Wir fügen die next()-Methode hinzu:

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

Zu diesem Zeitpunkt wird die Funktion unterbrochen Bei Waren = Wenn Yield auftritt und wir die Funktion next () erneut aufrufen, führt die Funktion nach der Unterbrechung nur den Inhalt aus, dh den Teil unter Yield im obigen Beispiel.

Wir fügen ein weiteres next() hinzu:
print(type(p))
 
#输出
<class &#39;generator&#39;>


Wir können next() zum zweiten Mal ausführen, um einen Teil des unten stehenden Inhalts zu ergeben, aber Den Waren wird kein Wert übertragen, daher sind die Waren keine.
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, 货物来了,准备搬到仓库!

Zusammenfassung:


Konvertieren Sie die Funktion durch yield in einen Generator. Sie müssen die next()-Methode verwenden, um
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 Behalten Sie einfach den Interrupt-Status der Funktion bei. Ein erneuter Aufruf von next() führt den Teil nach yield aus

Wenn yield keinen Wert zurückgibt, wird ein Wert „Keine“ zurückgegeben

2. Von send() übergebener Wert


Zusammenfassung:

__next__() ruft nur diese Ausbeute auf, was auch als Aufwecken der Ausbeute bezeichnet werden kann, den Wert jedoch nicht an die Ausbeute weitergibt.


Die Methode send() ruft yield auf und kann den Wert an yield übergeben

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搬进仓库了。
Sie müssen __next__() verwenden, bevor Sie die Funktion send() verwenden, da diese zuerst unterbrochen werden muss wird zum zweiten Mal aufgerufen. Erst dann kann der Wert übergeben werden.

3. Einzelner Thread zur Erzielung eines parallelen Effekts (Coroutine)


Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Coroutine-Betriebs des Python-Generators anhand von Beispielen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn