Maison >interface Web >js tutoriel >Comment utiliser le mot clé de rendement pour contrôler le flux d'exécution dans une fonction de générateur?

Comment utiliser le mot clé de rendement pour contrôler le flux d'exécution dans une fonction de générateur?

Robert Michael Kim
Robert Michael Kimoriginal
2025-03-12 16:33:15570parcourir

Comment utiliser le mot clé yield pour contrôler le flux d'exécution dans une fonction de générateur?

Le mot clé yield est utilisé dans une fonction pour le transformer en générateur. Au lieu de renvoyer une seule valeur et de se terminer, une fonction de générateur pause son exécution à chaque instruction yield , renvoyant une valeur à l'appelant. L'état de la fonction est conservé, ce qui lui permet de reprendre l'exécution d'où il s'est arrêté la prochaine fois qu'il s'appelle. Cela permet la génération d'une séquence de valeurs à la demande, plutôt que de générer la séquence entière à la fois.

Illustrons avec un exemple:

 <code class="python">def my_generator(n): for i in range(n): yield i*2 gen = my_generator(5) # Create a generator object for num in gen: print(num) # Output: 0, 2, 4, 6, 8</code>

Dans cet exemple, my_generator ne renvoie pas de liste. Au lieu de cela, chaque appel à next(gen) (implicitement fait dans la boucle for ) exécute la fonction jusqu'à ce que l'instruction yield suivant soit rencontrée. La valeur donnée est renvoyée et l'état de la fonction est enregistré. L'appel suivant au next(gen) reprend du point après le dernier yield . Le générateur se termine lorsque la fonction termine son exécution sans rencontrer un autre yield .

Quels sont les avantages de l'utilisation des générateurs avec le mot clé yield sur le renvoi d'une liste?

L'utilisation de générateurs avec yield offre plusieurs avantages par rapport au retour d'une liste:

  • Efficacité de la mémoire: les générateurs produisent des valeurs une à la fois. Ceci est particulièrement bénéfique pour traiter de grands ensembles de données qui ne s'adapteraient pas confortablement en mémoire en tant que liste. Une liste nécessite le stockage de toutes les valeurs en mémoire simultanément, alors qu'un générateur ne tient que la trace de l'état actuel et de la valeur suivante à générer.
  • Évaluation paresseuse: les générateurs ne calculent que les valeurs telles qu'elles sont demandées. Ceci est plus efficace que de pré-composer toutes les valeurs et de les stocker dans une liste, surtout si certaines valeurs peuvent ne pas être nécessaires.
  • Amélioration de la lisibilité: pour la génération de séquences, les générateurs conduisent souvent à un code plus propre et plus concis que la création et le retour des listes, en particulier pour les séquences complexes.
  • Séquences infinies: les générateurs peuvent facilement représenter des séquences infinies, ce qui est impossible avec les listes. Par exemple, vous pouvez créer un générateur qui donne indéfiniment les nombres premiers.

En bref, les générateurs sont idéaux lorsque vous devez produire une séquence de valeurs de manière itérative, sans la surcharge de mémoire de stockage de la séquence entière à la fois.

Puis-je utiliser yield en conjonction avec d'autres instructions de flux de contrôle comme if et for les boucles dans une fonction de générateur?

Oui, vous pouvez utiliser librement yield avec d'autres instructions de flux de contrôle comme if , elif , else , for et while boucles à l'intérieur d'une fonction de générateur. Cela permet de créer des séquences complexes et conditionnelles.

Voici un exemple incorporant if et for les boucles:

 <code class="python">def even_numbers_generator(n): for i in range(n): if i % 2 == 0: yield i even_gen = even_numbers_generator(10) for num in even_gen: print(num) # Output: 0, 2, 4, 6, 8</code>

Ce générateur utilise une for pour itérater et une condition if pour filtrer les nombres uniformes, ne donnant que les nombres pair dans la plage spécifiée.

En quoi le mot clé yield diffère-t-il du mot clé return dans le contexte d'une fonction de générateur?

La différence clé réside dans la façon dont ils affectent l'exécution de la fonction:

  • yield : pause l'exécution de la fonction, renvoie une valeur et préserve l'état de la fonction. La fonction peut être reproduite d'où elle s'était arrêtée.
  • return : termine complètement l'exécution de la fonction. L'état de la fonction est perdu et aucune autre valeur ne peut être générée. Une instruction return dans une fonction de générateur signale la fin de la séquence.

Essentiellement, yield crée un itérateur, tandis que return fournit un résultat final et met fin au processus. L'utilisation return dans une fonction de générateur est généralement effectuée pour signaler la fin de la séquence, bien qu'il soit également possible de return une valeur en plus de donner des valeurs (bien que cela soit moins courant). L'utilisation return sans donner de valeurs créerait simplement une fonction régulière, pas un générateur.

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