Você pode usar return
uma 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 yield
para transformar a função em um gerador, mas precedê-lo com return
para 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 if
instrução no-op por uma instrução no-op yield
. Mas é mais idiomático. Observe que apenas usar yield
nã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 yield
palavra-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 yield
funções baseadas em-são mais legíveis e sustentáveis.
if False: yield
mas ainda um tanto confuso para pessoas que não conhecem esse padrão