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 :
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!