Puede usarlo return
una vez en un generador; detiene la iteración sin producir nada y, por lo tanto, proporciona una alternativa explícita a dejar que la función se ejecute fuera de alcance. Por lo tanto, use yield
para convertir la función en un generador, pero preceda con return
para terminar el generador antes de generar nada.
>>> def f():
... return
... yield
...
>>> list(f())
[]
No estoy seguro de que sea mucho mejor que lo que tiene, simplemente reemplaza una if
declaración de no operación con una declaración de no operación yield
. Pero es más idiomático. Tenga en cuenta que el solo uso yield
no funciona.
>>> def f():
... yield
...
>>> list(f())
[None]
¿Por qué no usar iter(())
?
Esta pregunta se refiere específicamente a una función de generador vacía . Por esa razón, lo considero una pregunta sobre la consistencia interna de la sintaxis de Python, en lugar de una pregunta sobre la mejor manera de crear un iterador vacío en general.
Si la pregunta es sobre la mejor manera de crear un iterador vacío, entonces podría estar de acuerdo con Zectbumo sobre usarlo en su iter(())
lugar. Sin embargo, es importante observar que iter(())
no devuelve una función. Devuelve directamente un iterable vacío. Suponga que está trabajando con una API que espera un invocable que devuelve un iterable. Tendrás que hacer algo como esto:
def empty():
return iter(())
(El crédito debe ir a Unutbu por dar la primera versión correcta de esta respuesta).
Ahora, puede encontrar lo anterior más claro, pero puedo imaginar situaciones en las que sería menos claro. Considere este ejemplo de una larga lista de definiciones de funciones de generador (artificiales):
def zeros():
while True:
yield 0
def ones():
while True:
yield 1
...
Al final de esa larga lista, prefiero ver algo con un yield
en él, como esto:
def empty():
return
yield
o, en Python 3.3 y superior (como sugiere DSM ), esto:
def empty():
yield from ()
La presencia de la yield
palabra clave deja claro a simple vista que esta es solo otra función generadora, exactamente como todas las demás. Se necesita un poco más de tiempo para ver que la iter(())
versión está haciendo lo mismo.
Es una diferencia sutil, pero honestamente creo que las yield
funciones basadas en son más legibles y fáciles de mantener.
if False: yield
pero sigue siendo un poco confuso para las personas que no conocen este patrón