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 Noneme implica que la función a veces tiene unNonevalor de no retorno, pero en la ubicación dereturn None, no existe dicho valor de retorno. Escribir un noreturnsignifica para mí que nunca hay un valor de retorno interesante, como un "procedimiento" en lugar de una "función".returnimplica existir temprano de un "procedimiento" según el punto anterior.Respuestas:
Sobre el comportamiento real, no hay diferencia. Todos regresan
Noney 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 NoneEsto indica que la función está destinada a devolver un valor para su uso posterior, y en este caso devuelve
None. Este valorNonese puede usar en otro lugar.return Nonenunca se usa si no hay otros posibles valores de retorno de la función.En el siguiente ejemplo, volvemos
person'smothersi elpersondado es un ser humano. Si no es un humano, regresamosNoneyapersonque no tiene unmother(supongamos que no es un animal o algo así).Utilizando
returnEsto se usa por la misma razón que
breaken 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
prisonersy sabemos que uno de ellos tiene un cuchillo. Recorremos cadaprisoneruno 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 encontramosprisonercon un cuchillo, levantamos una alerta. Esto podría hacerse de muchas maneras diferentes y el usoreturnprobablemente no sea la mejor manera, pero es solo un ejemplo para mostrar cómo usarreturnpara 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
returnen 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 quereturnenvoidfunciones 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á pasandovara 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 unNonevalorif varantes 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.disregresaNone: -Xdis.distambié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
returnomitir la declaración a menos que la necesite para salir de la función antes de tiempo (en cuyo caso un desnudoreturnes más común) o devolver algo distinto deNone. También tiene sentido y parece ser idiomático escribirreturn Nonecuando está en una función que tiene otra ruta que devuelve algo distinto deNone. Escribirreturn Noneexplí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
Nonese usan comovoidfunciones en C: su propósito generalmente es operar sobre los argumentos de entrada en su lugar (a menos que esté usando datos globales ( estremecimientos )). RegresarNonegeneralmente hace más explícito que los argumentos fueron mutados. Esto deja un poco más claro por qué tiene sentido omitir lareturndeclaració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
returninstrucción, regresaNone.RubyyJavascriptadopta 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 cuentaJavaun 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 unavoidpalabra 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,
Nonese 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
Nonevalor 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 transmitirNoneen 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
returndeclaració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
returns vacía para indicar al lector es solo un final temprano de la ejecución y elNonevalor devuelto implícitamente no tiene ningún significado y no debe ser capturado (la función similar a un procedimiento siempre regresa deNonetodos 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