Maison  >  Article  >  développement back-end  >  Explication détaillée du fonctionnement de la coroutine du générateur Python avec des exemples

Explication détaillée du fonctionnement de la coroutine du générateur Python avec des exemples

巴扎黑
巴扎黑original
2017-09-05 11:11:201139parcourir

L'éditeur suivant vous apportera un exemple de fonctionnement de la coroutine du générateur Python. L'éditeur le trouve plutôt bon, je vais donc le partager avec vous maintenant et le donner comme référence pour tout le monde. Suivons l'éditeur et jetons un œil.

1. Méthode d'opération de rendement

Nous définissons un générateur comme suit :


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
Lorsque nous convertissons une fonction en générateur via le rendement, aucun résultat ne sera renvoyé lors de l'exécution directe de la fonction. Étant donné que la fonction est déjà un générateur à ce moment-là, nous devons obtenir la valeur via next() et quitter à nouveau la fonction lorsque le rendement est rencontré.


print(type(p))
 
#输出
<class &#39;generator&#39;>
Nous ajoutons la méthode 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, 货物来了,准备搬到仓库!
A ce moment, la fonction s'interrompt at marchandises = Là où le rendement se produit, lorsque nous appelons à nouveau la fonction next(), la fonction n'exécutera le contenu qu'après l'interruption, c'est-à-dire la partie ci-dessous rendement dans l'exemple ci-dessus.

Nous ajoutons un autre 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搬进仓库了。
Nous pouvons next() pour la deuxième fois pour exécuter une partie du contenu en dessous du rendement, mais Aucune valeur n'est transmise aux marchandises, donc les marchandises sont Aucune.

Résumé :

Convertissez la fonction en générateur via le rendement, vous devez utiliser la méthode next() pour exécuter

yield Conservez simplement l'état d'interruption de la fonction. Appeler à nouveau next() exécutera la partie après le rendement

Si le rendement ne renvoie pas de valeur, il renverra une valeur Aucun


2. Valeur transmise par 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搬进仓库了。

Résumé :

__next__() appelle simplement ce rendement, ce qui peut également être considéré comme réveillant le rendement, mais il ne transmet pas la valeur au rendement.

La méthode send() appelle rendement et peut transmettre la valeur à rendement

Vous devez utiliser __next__() avant d'utiliser la fonction send(), car elle doit d'abord être interrompue. est appelé pour la deuxième fois, ce n'est qu'alors que la valeur peut être transmise.


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. Fil unique pour obtenir un effet parallèle (coroutine)


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn