Você pode usar returnuma vez em um gerador; ele interrompe a iteração sem produzir nada e, portanto, fornece uma alternativa explícita para deixar a função sair do escopo. Portanto, use yieldpara transformar a função em um gerador, mas precedê-lo com returnpara encerrar o gerador antes de produzir qualquer coisa.
>>> def f():
... return
... yield
...
>>> list(f())
[]
Não tenho certeza se é muito melhor do que o que você tem - ele apenas substitui uma ifinstrução no-op por uma instrução no-op yield. Mas é mais idiomático. Observe que apenas usar yieldnão funciona.
>>> def f():
... yield
...
>>> list(f())
[None]
Por que não apenas usar iter(())?
Esta pergunta pergunta especificamente sobre uma função de gerador vazia . Por esse motivo, considero que seja uma questão sobre a consistência interna da sintaxe do Python, em vez de uma questão sobre a melhor maneira de criar um iterador vazio em geral.
Se a dúvida for realmente sobre a melhor maneira de criar um iterador vazio, você pode concordar com o Zectbumo sobre o uso iter(()). Porém, é importante observar que iter(())não retorna uma função! Ele retorna diretamente um iterável vazio. Suponha que você esteja trabalhando com uma API que espera um chamável que retorna um iterável. Você terá que fazer algo assim:
def empty():
return iter(())
(O crédito deve ir para Unutbu por fornecer a primeira versão correta desta resposta.)
Agora, você pode achar o acima mais claro, mas posso imaginar situações em que seria menos claro. Considere este exemplo de uma longa lista de definições de funções geradoras (inventadas):
def zeros():
while True:
yield 0
def ones():
while True:
yield 1
...
No final dessa longa lista, prefiro ver algo com um yield, como este:
def empty():
return
yield
ou, no Python 3.3 e superior (conforme sugerido pelo DSM ), isto:
def empty():
yield from ()
A presença da yieldpalavra-chave deixa claro à primeira vista que se trata apenas de mais uma função geradora, exatamente como todas as outras. Demora um pouco mais para ver que a iter(())versão está fazendo a mesma coisa.
É uma diferença sutil, mas honestamente acho que as yieldfunções baseadas em-são mais legíveis e sustentáveis.
if False: yieldmas ainda um tanto confuso para pessoas que não conhecem esse padrão