Considere tres funciones:
def my_func1():
print "Hello World"
return None
def my_func2():
print "Hello World"
return
def my_func3():
print "Hello World"
Todos parecen devolver ninguno. ¿Hay alguna diferencia entre cómo se comporta el valor devuelto de estas funciones? ¿Hay alguna razón para preferir uno frente al otro?
return None
me implica que la función a veces tiene unNone
valor de no retorno, pero en la ubicación dereturn None
, no existe dicho valor de retorno. Escribir un noreturn
significa para mí que nunca hay un valor de retorno interesante, como un "procedimiento" en lugar de una "función".return
implica existir temprano de un "procedimiento" según el punto anterior.Respuestas:
Sobre el comportamiento real, no hay diferencia. Todos regresan
None
y eso es todo. Sin embargo, hay un momento y un lugar para todo esto. Las siguientes instrucciones son básicamente cómo deberían usarse los diferentes métodos (o al menos cómo me enseñaron que deberían usarse), pero no son reglas absolutas, por lo que puede mezclarlos si lo considera necesario.Utilizando
return None
Esto indica que la función está destinada a devolver un valor para su uso posterior, y en este caso devuelve
None
. Este valorNone
se puede usar en otro lugar.return None
nunca se usa si no hay otros posibles valores de retorno de la función.En el siguiente ejemplo, volvemos
person
'smother
si elperson
dado es un ser humano. Si no es un humano, regresamosNone
yaperson
que no tiene unmother
(supongamos que no es un animal o algo así).Utilizando
return
Esto se usa por la misma razón que
break
en los bucles. El valor de retorno no importa y solo desea salir de toda la función. Es extremadamente útil en algunos lugares, aunque no lo necesite con tanta frecuencia.Tenemos 15
prisoners
y sabemos que uno de ellos tiene un cuchillo. Recorremos cadaprisoner
uno por uno para verificar si tienen un cuchillo. Si golpeamos a la persona con un cuchillo, simplemente podemos salir de la función porque sabemos que solo hay un cuchillo y no hay razón para verificar el restoprisoners
. Si no lo encontramosprisoner
con un cuchillo, levantamos una alerta. Esto podría hacerse de muchas maneras diferentes y el usoreturn
probablemente no sea la mejor manera, pero es solo un ejemplo para mostrar cómo usarreturn
para salir de una función.Nota: nunca debe hacerlo
var = find_prisoner_with_knife()
, ya que el valor de retorno no debe ser capturado.Usando no
return
en absolutoEsto también regresará
None
, pero ese valor no está destinado a ser usado o capturado. Simplemente significa que la función finalizó con éxito. Básicamente es lo mismo quereturn
envoid
funciones en lenguajes como C ++ o Java.En el siguiente ejemplo, establecemos el nombre de la madre de la persona y luego la función se cierra después de completarse con éxito.
Nota: nunca debe hacerlo
var = set_mother(my_person, my_mother)
, ya que el valor de retorno no debe ser capturado.fuente
var = get_mother()
está bien si está pasandovar
a otras funciones que aceptanNone
- "nunca" es un poco extremovar = get_mother()
no se puede usar? En mi humilde opinión, está totalmente bien hacer eso. Solo necesita asegurarse de verificar si no hay unNone
valorif var
antes de usarlo.Sí, todos son iguales.
Podemos revisar el código de máquina interpretado para confirmar que todos están haciendo exactamente lo mismo.
fuente
dis.dis
regresaNone
: -Xdis.dis
también informa algunos números de línea ...Cada uno devuelve el mismo singleton
None
: no hay diferencia funcional.Creo que es razonablemente idiomático
return
omitir la declaración a menos que la necesite para salir de la función antes de tiempo (en cuyo caso un desnudoreturn
es más común) o devolver algo distinto deNone
. También tiene sentido y parece ser idiomático escribirreturn None
cuando está en una función que tiene otra ruta que devuelve algo distinto deNone
. Escribirreturn None
explícitamente es una señal visual para el lector de que hay otra rama que devuelve algo más interesante (y que el código de llamada probablemente necesitará manejar ambos tipos de valores de retorno).A menudo, en Python, las funciones que devuelven
None
se usan comovoid
funciones en C: su propósito generalmente es operar sobre los argumentos de entrada en su lugar (a menos que esté usando datos globales ( estremecimientos )). RegresarNone
generalmente hace más explícito que los argumentos fueron mutados. Esto deja un poco más claro por qué tiene sentido omitir lareturn
declaración desde el punto de vista de las "convenciones del lenguaje".Dicho esto, si está trabajando en una base de código que ya tiene convenciones preestablecidas en torno a estas cosas, definitivamente haría lo mismo para ayudar a que la base de código se mantenga uniforme ...
fuente
return
instrucción, regresaNone
.Ruby
yJavascript
adopta el mismo enfoque que Python. Estoy seguro de que no son ejemplos de lenguajes de alto nivel que dicen "vacío" en la expresión, pero no puedo pensar en ninguna en el momento (tal vez si se tiene en cuentaJava
un lenguaje de alto nivel) ... ¿Cómo lo haría mono-parcheo ¿Una función (que es útil para burlarse en las pruebas, entre otras cosas) funciona en un mundo hipotético donde Python obtuvo unavoid
palabra clave que la hizo para que la función no devolviera nada? (Además, como dije antes, no necesitas convencerme de que este es un mal diseño. No puedo hacer nada, incluso si tienes razón)Como han respondido otros, el resultado es exactamente el mismo,
None
se devuelve en todos los casos.La diferencia es estilística, pero tenga en cuenta que PEP8 requiere que el uso sea consistente:
https://www.python.org/dev/peps/pep-0008/#programming-recommendations
Básicamente, si alguna vez devuelve un
None
valor no válido en una función, significa que el valor devuelto tiene significado y está destinado a ser captado por las personas que llaman. Entonces, cuando regreseNone
, también debe ser explícito, para transmitirNone
en este caso tiene sentido, es uno de los posibles valores de retorno.Si no necesita ningún retorno, su función básicamente funciona como un procedimiento en lugar de una función, por lo que simplemente no incluya la
return
declaración.Si está escribiendo una función similar a un procedimiento y existe la oportunidad de regresar antes (es decir, ya ha terminado en ese punto y no necesita ejecutar el resto de la función), puede usar una
return
s vacía para indicar al lector es solo un final temprano de la ejecución y elNone
valor devuelto implícitamente no tiene ningún significado y no debe ser capturado (la función similar a un procedimiento siempre regresa deNone
todos modos).fuente
En términos de funcionalidad, todos son iguales, la diferencia entre ellos está en la legibilidad y el estilo del código (que es importante tener en cuenta)
fuente