Comment le retour affecte-t-il le comportement du générateur dans Python 3.3 ?

Barbara Streisand
Libérer: 2024-10-24 17:16:02
original
777 Les gens l'ont consulté

How does Return Affect Generator Behavior in Python 3.3?

Return Inside Generator avec Yield

Dans Python 3.3, un changement important a été introduit concernant l'utilisation du return aux côtés du rendement dans les fonctions du générateur. Contrairement à Python 2, où un tel code déclencherait une erreur, Python 3.3 le permet. Cependant, le comportement diffère de ce à quoi on pourrait s'attendre.

Considérez le code Python 3.3 suivant :

<code class="python">def f():
  return 3
  yield 2
  
x = f()
print(x.__next__())</code>
Copier après la connexion

Si vous exécutez ce code, vous remarquerez qu'une exception est levée : StopIteration : 3. Cette exception a deux aspects clés :

  • StopIteration est déclenché : L'instruction return à l'intérieur de la fonction génératrice est désormais équivalente à raise StopIteration().
  • Valeur accessible via Exception : La valeur renvoyée (dans ce cas, 3) est accessible via l'attribut value de l'objet exception.

Ainsi, lorsqu'un générateur La fonction contient à la fois return et rendement, c'est comme déclencher une exception StopIteration avec la valeur de retour spécifiée. Cela signifie que le générateur se terminera et que la valeur renvoyée sera disponible via l'attribut value de l'exception.

En d'autres termes, alors que le retour dans une fonction génératrice était auparavant une erreur, il a désormais un objectif spécifique : terminez le générateur et renvoyez une valeur via le mécanisme de gestion des exceptions.

Ce comportement a des implications pour la délégation du générateur en utilisant la nouvelle syntaxe rendement from dans Python 3.3. Par exemple :

<code class="python">def f():
    return 1
    yield 2

def g():
    x = yield from f()
    print(x)

# Iterate over generator to run it
for _ in g():
    pass</code>
Copier après la connexion

Dans ce code, le générateur f renvoie 1 puis délègue au générateur g, qui imprime la valeur renvoyée. Cependant, vous ne verrez que 1 imprimé, indiquant que l'instruction rendement arrête la délégation avant que l'instruction rendement dans f puisse produire la valeur 2.

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!

source:php
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal