Maison  >  Article  >  développement back-end  >  Comment le retour affecte-t-il le comportement du générateur dans Python 3.3 ?

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

Barbara Streisand
Barbara Streisandoriginal
2024-10-24 17:16:02778parcourir

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>

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>

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!

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