¿Cuál es la explicación básica simple de qué es la declaración de devolución, cómo usarla en Python?
¿Y cuál es la diferencia entre esto y la print
declaración?
¿Cuál es la explicación básica simple de qué es la declaración de devolución, cómo usarla en Python?
¿Y cuál es la diferencia entre esto y la print
declaración?
Respuestas:
La print()
función escribe, es decir, "imprime", una cadena en la consola. La return
declaración hace que su función salga y devuelva un valor a su llamador. El objetivo de las funciones en general es tomar entradas y devolver algo. La return
declaración se usa cuando una función está lista para devolver un valor a su llamador.
Por ejemplo, aquí hay una función que utiliza print()
y return
:
def foo():
print("hello from inside of foo")
return 1
Ahora puede ejecutar código que llame a foo, así:
if __name__ == '__main__':
print("going to call foo")
x = foo()
print("called foo")
print("foo returned " + str(x))
Si ejecuta esto como una secuencia de comandos (por ejemplo, un .py
archivo) en lugar de en el intérprete de Python, obtendrá la siguiente salida:
going to call foo
hello from inside foo
called foo
foo returned 1
Espero que esto lo aclare más. El intérprete escribe valores de retorno en la consola para que pueda ver por qué alguien podría estar confundido.
Aquí hay otro ejemplo del intérprete que demuestra que:
>>> def foo():
... print("hello from within foo")
... return 1
...
>>> foo()
hello from within foo
1
>>> def bar():
... return 10 * foo()
...
>>> bar()
hello from within foo
10
Puede ver que cuando foo()
se llama desde bar()
, 1 no se escribe en la consola. En su lugar, se utiliza para calcular el valor devuelto bar()
.
print()
es una función que causa un efecto secundario (escribe una cadena en la consola), pero la ejecución se reanuda con la siguiente instrucción. return
hace que la función deje de ejecutarse y devuelva un valor a quien lo haya llamado.
"foo returned " + str(x)
o de lo contrario obtendrás TypeError: cannot concatenate 'str' and 'int' objects
.
Piense en la declaración de impresión como causante de un efecto secundario , hace que su función escriba algo de texto para el usuario, pero no puede ser utilizado por otra función.
Intentaré explicar esto mejor con algunos ejemplos y un par de definiciones de Wikipedia.
Aquí está la definición de una función de Wikipedia
Una función, en matemáticas, asocia una cantidad, el argumento de la función, también conocida como entrada, con otra cantidad, el valor de la función, también conocida como salida.
Piense en eso por un segundo. ¿Qué significa cuando dice que la función tiene un valor?
¡Lo que significa es que puedes sustituir el valor de una función por un valor normal! (Suponiendo que los dos valores son el mismo tipo de valor)
¿Por qué querrías que preguntes?
¿Qué pasa con otras funciones que pueden aceptar el mismo tipo de valor como entrada ?
def square(n):
return n * n
def add_one(n):
return n + 1
print square(12)
# square(12) is the same as writing 144
print add_one(square(12))
print add_one(144)
#These both have the same output
Existe un término matemático elegante para las funciones que solo dependen de sus entradas para producir sus salidas: Transparencia referencial. Nuevamente, una definición de Wikipedia.
La transparencia referencial y la opacidad referencial son propiedades de partes de los programas informáticos. Se dice que una expresión es referencialmente transparente si se puede reemplazar con su valor sin cambiar el comportamiento de un programa.
Puede ser un poco difícil comprender qué significa esto si eres nuevo en la programación, pero creo que lo conseguirás después de experimentar un poco. Sin embargo, en general, puede hacer cosas como imprimir en una función, y también puede tener una declaración de retorno al final.
Solo recuerde que cuando usa return, básicamente está diciendo "Una llamada a esta función es lo mismo que escribir el valor que se devuelve"
Python realmente insertará un valor de retorno por usted si se niega a ingresar el suyo, se llama "Ninguno", y es un tipo especial que simplemente no significa nada o es nulo.
En Python, comenzamos a definir una función con "def" y, en general, pero no necesariamente, finalizamos la función con "return".
Una función de la variable x se denota como f (x). ¿Qué hace esta función? Supongamos que esta función suma 2 ax. Entonces, f (x) = x + 2
Ahora, el código de esta función será:
def A_function (x):
return x + 2
Después de definir la función, puede usarla para cualquier variable y obtener el resultado. Como:
print A_function (2)
>>> 4
Podríamos escribir el código de forma ligeramente diferente, como por ejemplo:
def A_function (x):
y = x + 2
return y
print A_function (2)
Eso también daría "4".
Ahora, incluso podemos usar este código:
def A_function (x):
x = x + 2
return x
print A_function (2)
Eso también daría 4. Ver, que la "x" al lado de return en realidad significa (x + 2), no x de "A_function (x)".
Supongo que a partir de este simple ejemplo, comprenderá el significado del comando de retorno.
return
significa "generar este valor desde esta función".
print
significa "enviar este valor a (generalmente) stdout"
En Python REPL, se mostrará un retorno de función en la pantalla de forma predeterminada (esto no es lo mismo que imprimir).
Este es un ejemplo de impresión:
>>> n = "foo\nbar" #just assigning a variable. No output
>>> n #the value is output, but it is in a "raw form"
'foo\nbar'
>>> print n #the \n is now a newline
foo
bar
>>>
Este es un ejemplo de devolución:
>>> def getN():
... return "foo\nbar"
...
>>> getN() #When this isn't assigned to something, it is just output
'foo\nbar'
>>> n = getN() # assigning a variable to the return value. No output
>>> n #the value is output, but it is in a "raw form"
'foo\nbar'
>>> print n #the \n is now a newline
foo
bar
>>>
Esta respuesta repasa algunos de los casos que no se han discutido anteriormente.
La declaración de devolución le permite rescindir la ejecución de una función antes de llegar al final. Esto hace que el flujo de ejecución regrese inmediatamente al llamador.
En la línea número 4:
def ret(n):
if n > 9:
temp = "two digits"
return temp #Line 4
else:
temp = "one digit"
return temp #Line 8
print("return statement")
ret(10)
Después de que se ejecuta la declaración condicional, la ret()
función se termina debido a return temp
(línea 4). Por lo tanto, laprint("return statement")
, no se ejecuta.
Salida:
two digits
Este código que aparece después de las declaraciones condicionales, o el lugar donde el flujo de control no puede llegar, es el código muerto .
Devolución de valores
En las líneas 4 y 8, la declaración de devolución se utiliza para devolver el valor de una variable temporal después de que se haya ejecutado la condición.
Para resaltar la diferencia entre imprimir y devolver :
def ret(n):
if n > 9:
print("two digits")
return "two digits"
else :
print("one digit")
return "one digit"
ret(25)
Salida:
two digits
'two digits'
Solo para agregar a la excelente respuesta de @Nathan Hughes:
La return
declaración se puede utilizar como una especie de flujo de control. Al poner una (o más) return
declaraciones en medio de una función, podemos decir: "deja de ejecutar esta función. ¡O tenemos lo que queríamos o algo salió mal!"
He aquí un ejemplo:
>>> def make_3_characters_long(some_string):
... if len(some_string) == 3:
... return False
... if str(some_string) != some_string:
... return "Not a string!"
... if len(some_string) < 3:
... return ''.join(some_string,'x')[:,3]
... return some_string[:,3]
...
>>> threechars = make_3_characters_long('xyz')
>>> if threechars:
... print threechars
... else:
... print "threechars is already 3 characters long!"
...
threechars is already 3 characters long!
Consulte la sección Estilo de código de la Guía de Python para obtener más consejos sobre esta forma de uso return
.
La diferencia entre "devolver" e "imprimir" también se puede encontrar en el siguiente ejemplo:
REGRESO:
def bigger(a, b):
if a > b:
return a
elif a <b:
return b
else:
return a
El código anterior dará resultados correctos para todas las entradas.
IMPRESIÓN:
def bigger(a, b):
if a > b:
print a
elif a <b:
print b
else:
print a
NOTA: Esto fallará en muchos casos de prueba.
ERROR:
----
FAILURE
: Test case input: 3, 8.
Expected result: 8
FAILURE
: Test case input: 4, 3.
Expected result: 4
FAILURE
: Test case input: 3, 3.
Expected result: 3
You passed 0 out of 3 test cases
Creo que una respuesta realmente simple podría ser útil aquí:
return
hace que el valor (una variable, a menudo) esté disponible para que lo use la persona que llama (por ejemplo, para que lo almacene una función dentro de la cual se encuentra la función que usa return
). Sin él return
, su valor o variable no estaría disponible para que la persona que llama los almacene / reutilice.
print
se imprime en la pantalla, pero no hace que el valor o la variable estén disponibles para que los utilice la persona que llama.
(Admitiendo plenamente que las respuestas más completas son más precisas).
Aquí está mi comprensión. (espero que ayude a alguien y es correcto).
def count_number_of(x):
count = 0
for item in x:
if item == "what_you_look_for":
count = count + 1
return count
Entonces, esta simple pieza de código cuenta el número de ocurrencias de algo. La colocación de retorno es significativa. Le dice a su programa dónde necesita el valor. Entonces, cuando imprime, envía la salida a la pantalla. Cuando regresa le dice al valor que vaya a alguna parte. En este caso, puede ver que count = 0 está sangrado con return; queremos que el valor (count + 1) reemplace 0. Si intenta seguir la lógica del código cuando aplica más sangría al comando return, la salida siempre será 1 , porque nunca le diríamos al recuento inicial que cambie. Espero haberlo hecho bien. Ah, y el retorno siempre está dentro de una función.
return
es parte de la definición de una función, mientras que print
envía texto a la salida estándar (generalmente la consola).
Una función es un procedimiento que acepta parámetros y devuelve un valor. return
es para el último, mientras que el primero está terminado def
.
Ejemplo:
def timestwo(x):
return x*2
Lo mejor de la return
función es que puede devolver un valor de la función, pero puede hacer lo mismo con, print
entonces, ¿cuál es la diferencia? Básicamente, return
no se trata simplemente de devolverlo, da salida en forma de objeto para que podamos guardar ese valor de retorno de la función en cualquier variable, pero no podemos hacerlo print
porque es lo mismo que stdout/cout
en C Programming
.
Siga el código a continuación para una mejor comprensión
def add(a, b):
print "ADDING %d + %d" % (a, b)
return a + b
def subtract(a, b):
print "SUBTRACTING %d - %d" % (a, b)
return a - b
def multiply(a, b):
print "MULTIPLYING %d * %d" % (a, b)
return a * b
def divide(a, b):
print "DIVIDING %d / %d" % (a, b)
return a / b
print "Let's do some math with just functions!"
age = add(30, 5)
height = subtract(78, 4)
weight = multiply(90, 2)
iq = divide(100, 2)
print "Age: %d, Height: %d, Weight: %d, IQ: %d" % (age, height, weight, iq)
# A puzzle for the extra credit, type it in anyway.
print "Here is a puzzle."
what = add(age, subtract(height, multiply(weight, divide(iq, 2))))
print "That becomes: ", what, "Can you do it by hand?"
Ahora estamos haciendo nuestras propias funciones matemáticas para add, subtract, multiply,
y divide
. Lo importante a notar es la última línea donde decimos return a + b
(in add
). Lo que hace es lo siguiente:
a
y b
.a + b
. Podría decir esto como "Los agrego a
y b
luego los devuelvo".a + b
resultado a una variable.return
debe usarse para funciones / métodos recursivos o desea usar el valor devuelto para aplicaciones posteriores en su algoritmo.
print
debe usarse cuando desea mostrar una salida significativa y deseada al usuario y no desea saturar la pantalla con resultados intermedios en los que el usuario no está interesado, aunque son útiles para depurar su código.
El siguiente código muestra cómo usar return
y print
correctamente:
def fact(x):
if x < 2:
return 1
return x * fact(x - 1)
print(fact(5))
Esta explicación es válida para todos los lenguajes de programación, no solo para Python .