none - python isnull or empty
Python-retorno, retorno Ninguno, y ningĂșn retorno en absoluto (4)
Cada uno de ellos devuelve el mismo singleton None
: no hay diferencia funcional.
Creo que es razonablemente idiomático omitir la declaración de return
, a menos que la necesite para 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 que es idiomático escribir el return None
cuando está en una función que tiene otro camino que devuelve algo distinto de None
. Escribir el return None
explícitamente es una indicación visual para el lector de que hay otra rama 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é utilizando 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 declaración 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 sobre estas cosas, definitivamente seguiré el ejemplo para ayudar a que la base de códigos se mantenga uniforme ...
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 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
Nota: nunca debe hacer var = get_mother()
, ya que asumimos que var es un diccionario y que itera con var.items () dará un error al citar. Ninguno tiene elementos de método (). Si devuelve intencionalmente Ninguno, debe ser atendido apropiadamente en la función de llamada.
Usando el return
Esto se usa por la misma razón que la break
de 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 resto 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
en 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.
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)
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