volver, devolver ninguno, y no hay retorno en absoluto?

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 regresar 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?

En el comportamiento real, no hay diferencia. Todos devuelven None y eso es todo. Sin embargo, hay un tiempo y un lugar para todos estos. Las siguientes instrucciones son básicamente cómo deben usarse los diferentes métodos (o al menos cómo me enseñaron que deben usarse), pero no son reglas absolutas, por lo que puede mezclarlas si lo considera necesario.

Usando return None

Esto indica que, de hecho, la función está destinada a devolver un valor para su uso posterior y, en este caso, no devuelve None . Este valor None puede ser usado en otro lugar. return None nunca se usa si no hay otros valores de retorno posibles de la función.

En el siguiente ejemplo, devolvemos a la mother la person si la person dada es un humano. Si no es un humano, devolvemos None ya que la person no tiene mother (supongamos que no es un animal o algo así).

 def get_mother(person): if is_human(person): return person.mother else: return None 

Usando el return

Esto se usa por la misma razón que la break de 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 necesites tan a menudo.

Tenemos 15 prisoners y sabemos que uno de ellos tiene un cuchillo. Recorremos cada prisoner uno por uno para comprobar si tienen un cuchillo. Si golpeamos a la persona con un cuchillo, podemos simplemente salir de la función porque sabemos que solo hay un cuchillo y no hay razón para que el rest de los prisoners controlen. Si no encontramos al prisoner con un cuchillo, alertamos. Esto se puede hacer de muchas maneras diferentes y el uso de return probablemente ni siquiera sea la mejor, pero es solo un ejemplo para mostrar cómo usar el return para salir de una función.

 def find_prisoner_with_knife(prisoners): for prisoner in prisoners: if "knife" in prisoner.items: prisoner.move_to_inquisition() return # no need to check rest of the prisoners nor raise an alert raise_alert() 

Nota: Nunca debes hacer var = find_prisoner_with_knife() , ya que el valor de retorno no está destinado a ser capturado.

Usando sin return en absoluto

Esto también devolverá None , pero ese valor no está destinado a ser usado o capturado. Simplemente significa que la función terminó con éxito. Básicamente, es lo mismo que return funciones void 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 completar con éxito.

 def set_mother(person, mother): if is_human(person): person.mother = mother 

Nota: nunca debe hacer var = set_mother(my_person, my_mother) , ya que el valor de retorno no está destinado a ser capturado.

Sí, todos son iguales.

Podemos revisar el código de máquina interpretado para confirmar que todos están haciendo exactamente lo mismo.

 import dis def f1(): print "Hello World" return None def f2(): print "Hello World" return def f3(): print "Hello World" dis.dis(f1) 4 0 LOAD_CONST 1 ('Hello World') 3 PRINT_ITEM 4 PRINT_NEWLINE 5 5 LOAD_CONST 0 (None) 8 RETURN_VALUE dis.dis(f2) 9 0 LOAD_CONST 1 ('Hello World') 3 PRINT_ITEM 4 PRINT_NEWLINE 10 5 LOAD_CONST 0 (None) 8 RETURN_VALUE dis.dis(f3) 14 0 LOAD_CONST 1 ('Hello World') 3 PRINT_ITEM 4 PRINT_NEWLINE 5 LOAD_CONST 0 (None) 8 RETURN_VALUE 

Todos devuelven el mismo singleton None : no hay diferencia funcional.

Creo que es razonablemente idiomático omitir la statement de return , a menos que necesite salir de la función antes de tiempo (en cuyo caso es más común una return simple) o devolver algo que None sea None . También tiene sentido y parece ser idiomático para escribir el return None cuando está en una función que tiene otro camino que devuelve algo distinto a None . Escribir el return None explícitamente es una indicación visual para el lector de que hay otra twig que devuelve algo más interesante (y que el código de llamada probablemente deba manejar ambos tipos de valores de retorno).

A menudo, en Python, las funciones que devuelven None se usan como funciones de void en C: su propósito generalmente es operar con los argumentos de entrada en su lugar (a menos que esté usando datos globales ( shudders )). Devolver None por lo general hace que sea más explícito que los argumentos se hayan mutado. Esto deja un poco más claro por qué tiene sentido dejar de lado la statement de return desde un punto de vista de “convenciones lingüísticas”.

Dicho esto, si estás trabajando en una base de códigos que ya tiene convenciones preestablecidas en torno a estas cosas, definitivamente seguiré el ejemplo para ayudar a que la base de códigos se mantenga uniforme …

En términos de funcionalidad, todos son iguales, la diferencia entre ellos está en la legibilidad y el estilo del código (lo que es importante tener en cuenta)