Vous pouvez utiliser return
une fois dans un générateur; il arrête l'itération sans rien donner, et fournit ainsi une alternative explicite à laisser la fonction s'exécuter hors de portée. Utilisez donc yield
pour transformer la fonction en générateur, mais faites-la précéder de return
pour terminer le générateur avant de donner quoi que ce soit.
>>> def f():
... return
... yield
...
>>> list(f())
[]
Je ne suis pas sûr que ce soit tant mieux que ce que vous avez - cela remplace simplement une if
instruction no-op par une instruction no-op yield
. Mais c'est plus idiomatique. Notez que la simple utilisation yield
ne fonctionne pas.
>>> def f():
... yield
...
>>> list(f())
[None]
Pourquoi ne pas simplement utiliser iter(())
?
Cette question concerne spécifiquement une fonction de générateur vide . Pour cette raison, je considère que c'est une question sur la cohérence interne de la syntaxe de Python, plutôt qu'une question sur la meilleure façon de créer un itérateur vide en général.
Si la question porte en fait sur la meilleure façon de créer un itérateur vide, vous pourriez être d'accord avec Zectbumo sur l'utilisation à la iter(())
place. Cependant, il est important de noter que iter(())
cela ne renvoie pas de fonction! Il renvoie directement un itérable vide. Supposons que vous travaillez avec une API qui attend un appelable qui renvoie un itérable. Vous devrez faire quelque chose comme ceci:
def empty():
return iter(())
(Le mérite revient à Unutbu d' avoir donné la première version correcte de cette réponse.)
Maintenant, vous pouvez trouver ce qui précède plus clair, mais je peux imaginer des situations dans lesquelles ce serait moins clair. Considérez cet exemple d'une longue liste de définitions de fonctions de générateur (artificielles):
def zeros():
while True:
yield 0
def ones():
while True:
yield 1
...
À la fin de cette longue liste, je préfère voir quelque chose avec un yield
dedans, comme ceci:
def empty():
return
yield
ou, dans Python 3.3 et supérieur (comme suggéré par DSM ), ceci:
def empty():
yield from ()
La présence du yield
mot - clé montre clairement au plus bref coup d'œil qu'il ne s'agit que d'une autre fonction de générateur, exactement comme toutes les autres. Il faut un peu plus de temps pour voir que la iter(())
version fait la même chose.
C'est une différence subtile, mais je pense honnêtement que les yield
fonctions basées sont plus lisibles et maintenables.
if False: yield
mais toujours un peu déroutant pour les personnes qui ne connaissent pas ce modèle