Considere três funções:
def my_func1():
print "Hello World"
return None
def my_func2():
print "Hello World"
return
def my_func3():
print "Hello World"
Todos eles parecem retornar Nenhum. Existem diferenças entre como o valor retornado dessas funções se comporta? Existem razões para preferir um versus o outro?
return None
implica para mim que a função às vezes tem umNone
valor de não retorno, mas no local dereturn None
, não existe esse valor de retorno. Escrever não significareturn
para mim que nunca há um valor de retorno interessante, como um "procedimento" em oposição a uma "função".return
implica a existência antecipada de um "procedimento" conforme o ponto anterior.Respostas:
No comportamento real, não há diferença. Todos eles retornam
None
e é isso. No entanto, há um tempo e um lugar para todos eles. As instruções a seguir são basicamente como os diferentes métodos devem ser usados (ou pelo menos como eu fui ensinado que eles devem ser usados), mas eles não são regras absolutas, portanto você pode misturá-los se achar necessário.Usando
return None
Isso indica que a função realmente deve retornar um valor para uso posterior e, nesse caso, ela retorna
None
. Esse valorNone
pode ser usado em outro lugar.return None
nunca será usado se não houver outros valores de retorno possíveis da função.No exemplo a seguir, retornamos
person
'smother
se operson
dado é humano. Se não é humano, retornamos,None
poisperson
não possui ummother
(suponha que não seja um animal ou algo assim).Usando
return
Isso é usado pelo mesmo motivo que
break
em loops. O valor de retorno não importa e você deseja apenas sair de toda a função. É extremamente útil em alguns lugares, mesmo que você não precise com tanta frequência.Temos 15
prisoners
e sabemos que um deles tem uma faca. Percorremos cadaprisoner
um por um para verificar se eles têm uma faca. Se batermos na pessoa com uma faca, podemos simplesmente sair da função, porque sabemos que há apenas uma faca e não há razão para o resto da verificaçãoprisoners
. Se não encontrarmosprisoner
com uma faca, acionamos um alerta. Isso pode ser feito de muitas maneiras diferentes e o usoreturn
provavelmente não é o melhor, mas é apenas um exemplo para mostrar como usarreturn
para sair de uma função.Nota: Você nunca deve fazer isso
var = find_prisoner_with_knife()
, pois o valor de retorno não deve ser capturado.Não usar
return
em tudoIsso também retornará
None
, mas esse valor não deve ser usado ou capturado. Significa simplesmente que a função terminou com sucesso. É basicamente o mesmo quereturn
emvoid
funções em linguagens como C ++ ou Java.No exemplo a seguir, definimos o nome da mãe da pessoa e a função é encerrada após a conclusão com êxito.
Nota: Você nunca deve fazer isso
var = set_mother(my_person, my_mother)
, pois o valor de retorno não deve ser capturado.fonte
var = get_mother()
está OK se você estiver passandovar
para outras funções que aceitamNone
- "never" é um pouco extremovar = get_mother()
não pode ser usado? IMHO, é totalmente bom fazer isso. Você só precisa verificar se não há umNone
valorif var
antes de usá-lo.Sim, eles são todos iguais.
Podemos revisar o código de máquina interpretado para confirmar se todos estão fazendo exatamente a mesma coisa.
fonte
dis.dis
retornaNone
: -Xdis.dis
também relata alguns números de linha ...Cada um deles retorna o mesmo singleton
None
- Não há diferença funcional.Eu acho que é razoavelmente idiomático deixar de fora a
return
declaração, a menos que você precise interromper a função mais cedo (nesse caso, um nureturn
é mais comum) ou retornar algo diferenteNone
. Também faz sentido e parece idiomático escreverreturn None
quando está em uma função que possui outro caminho que retorna algo diferente deNone
. Escreverreturn None
explicitamente é uma dica visual para o leitor de que há outro ramo que retorna algo mais interessante (e que o código de chamada provavelmente precisará lidar com os dois tipos de valores de retorno).Freqüentemente, em Python, funções que retornam
None
são usadas comovoid
funções em C - seu objetivo geralmente é operar nos argumentos de entrada existentes (a menos que você esteja usando dados globais ( estremecimentos )). O retornoNone
geralmente torna mais explícito que os argumentos foram alterados. Isso deixa um pouco mais claro o porquê de fazer sentido deixar de lado areturn
declaração do ponto de vista de "convenções linguísticas".Dito isto, se você estiver trabalhando em uma base de código que já possui convenções pré-definidas sobre essas coisas, eu definitivamente seguiria o exemplo para ajudar a base de código a permanecer uniforme ...
fonte
return
instrução, ela retornaNone
.Ruby
eJavascript
seguem a mesma abordagem do python. Tenho certeza de que não são exemplos de linguagens de alto nível que dizem "vazio" na expressão, mas eu não consigo pensar em nenhum no momento (talvez se você considerarJava
uma linguagem de alto nível) ... Como seria macaco-patching uma função (que é útil para zombar de testes, entre outras coisas) funciona em um mundo hipotético em que python recebeu umavoid
palavra - chave que a criou para que a função não retornasse nada? (Além disso, como eu disse antes, você não precisa me convencer de que este é um projeto ruim eu não posso fazer nada, mesmo se você está certo.)Como outros já responderam, o resultado é exatamente o mesmo,
None
é retornado em todos os casos.A diferença é estilística, mas observe que o PEP8 exige que o uso seja consistente:
https://www.python.org/dev/peps/pep-0008/#programming-recommendations
Basicamente, se você retornar um
None
valor sem valor em uma função, isso significa que o valor de retorno tem significado e deve ser capturado pelos chamadores. Portanto, quando você retornaNone
, também deve ser explícito; transmitirNone
, nesse caso, tem significado, é um dos possíveis valores de retorno.Se você não precisar retornar, a função funciona basicamente como um procedimento, e não como uma função, portanto, não inclua a
return
instruçãoSe você estiver escrevendo uma função semelhante a um procedimento e houver uma oportunidade de retornar mais cedo (ou seja, você já terminou nesse ponto e não precisa executar o restante da função), use
return
es vazio para sinalizar para o leitor é apenas um término inicial da execução e oNone
valor retornado implicitamente não tem nenhum significado e não deve ser capturado (a função semelhante a procedimento sempre retorna deNone
qualquer maneira).fonte
Em termos de funcionalidade, são todos iguais, a diferença entre eles está na legibilidade e no estilo do código (o que é importante considerar)
fonte