6.2. Funciones que devuelven valores
La mayoría de las funciones requieren argumentos, valores que controlan cómo la función hace su trabajo. Por ejemplo, si desea encontrar el valor absoluto de un número, tiene que indicar cuál es el número. Python tiene una función incorporada para la computación el valor absoluto:
>>print(abs(5))
>>print(abs(-5))
Actividad: 6.2.1 Activecode (CH04_4)
En este ejemplo, los argumentos a la abs
La función son 5 y -5.
Algunas funciones toman más de un argumento. Por ejemplo, el módulo matemático contiene una función
llamada
pow
que toma dos argumentos, la base y el exponente.
>>import math
>>print(math.pow(2, 3))
>>print(math.pow(7, 4))
Actividad: 6.2.2 Activecode (CH04_5)
Nota:
Por supuesto, ya hemos visto que elevar una base a un exponente se puede hacer con el operador **.
Otra función incorporada que toma más de un argumento es max
.
>>print(max(7, 11))
>>print(max(4, 1, 17, 2, 12))
>>print(max(3 * 11, 5 ** 3, 512 - 9, 1024 ** 0))
Actividad: 6.2.3 Activecode (CH04_6)
max
se puede enviar cualquier número de argumentos, separados por comas, y
devolver el valor máximo enviado. Los argumentos pueden ser valores simples o
Expresiones. En el último ejemplo, se devuelve 503, ya que es mayor que 33,
125 y 1. Tenga en cuenta que max
También funciona en listas de valores.
Además, funciones como range
, int
, abs
Todos los valores de retorno que
se puede usar para construir expresiones más complejas.
Entonces, una diferencia importante entre estas funciones y una como drawSquare
es que
drawSquare
no fue ejecutado porque queríamos que calculara un valor, por el contrario,
escribimos drawSquare
Porque queríamos que ejecutara una secuencia de pasos que causaron
la tortuga para dibujar una forma específica.
Las funciones que devuelven los valores a veces se llaman funciones fructíferas . En muchos otros idiomas, una parte que no devuelve un valor se llama procedimiento , Pero nos quedaremos aquí con la forma de Python de llamarlo también una función, o si queremos Para estresarlo, una no fruitante función
Las funciones fructíferas aún permiten al usuario proporcionar información (argumentos). Sin embargo, ahora hay un adicional de Datos que se devuelven de la función.

¿Cómo escribimos nuestra propia función fructífera? Comencemos por crear un muy simple
función matemática que llamaremos square
. La función cuadrada tomará un número
Como parámetro y devuelve el resultado de cuadrar ese número. Aquí está el
Diagrama de caja negra con el código Python siguiente.

>>def square(x):
>>y = x * x
>>return y
>>toSquare = 10
>>result = square(toSquare)
>>print("The result of", toSquare, "squared is", result)
Actividad: 6.2.4 Activecode (CH04_Square)
La de retorno es seguida por una expresión que se evalúa. Es
El resultado se devuelve a la persona que llama como la "fruta" de llamar a esta función.
Porque la declaración de retorno puede contener cualquier expresión de pitón que podríamos tener
evitó crear la variable temporal y
y simplemente usado
return x*x
.
Intente modificar la función cuadrada anterior para ver que esto funciona de la misma manera.
Por otro lado, usando variables temporales como y
En el programa anterior hace
depuración
más fácil. Estas variables temporales son ejemplos de variables locales , perseguidas más
En la siguiente sección.
Observe algo importante aquí. El nombre de la variable que pasamos como un
argumento - toSquare
- no tiene nada que ver con el nombre del parámetro formal
- x
. Es como si x = toSquare
se ejecuta cuando square
se llama.
No importa cómo se llamara el valor en
la persona que llama. En square
, su nombre es x
. Puedes ver esto muy claramente en
Codelens, donde las variables globales (variables definidas fuera de cualquier función) y las variables locales para el cuadrado
La función está en cajas separadas.
A medida que avanza el ejemplo en Codelens, observe que la de devolución no solo causa el función para devolver un valor, pero también devuelve el flujo de control al lugar del programa donde se realizó la llamada de función. Esto es cierto en general:
Nota
La llamada a una función termina después de la ejecución de una declaración de devolución. Esto es bastante obvio si la declaración de retorno es la última declaración en la función, pero Veremos más tarde dónde tiene sentido tener una declaración de devolución incluso cuando otras declaraciones Sigue y las declaraciones adicionales no ejecutan.
1 | Def cuadrado (x): |
2 | y = x * x |
3 | regresar y |
4 | |
5 | tosquare = 10 |
6 | SquarReResult = Square (Tosquare) |
7 | Imprimir ("El resultado de", Tosquare, "Squared Is", SquarReResult) |
siguiente linea a ejecutar
Salida de impresión (arrastre la esquina inferior derecha para cambiar el tamaño)
|
Actividad: Codelens 6.2.5 (CH04_CLSQUARE)
Otra cosa importante a notar a medida que atraviesa este codelens La demostración es el movimiento de las flechas rojas y verdes. Codelens usa estas flechas para mostrarle dónde se está ejecutando actualmente. Recuerde que la flecha roja siempre apunta a la siguiente línea de código que se ejecutará. La flecha verde claro apunta a la línea Eso se ejecutó en el último paso.
Cuando comience a ejecutar esta demostración de Codelens, notará que solo hay una flecha roja y apunta a Línea 1. Esto se debe a que la línea 1 es la siguiente línea que se ejecutará y, dado que es la primera línea, no hay línea ejecutada previamente de código.
Cuando haga clic en el botón
Forward, observe que la flecha roja se mueve a la línea 5, omitiendo las
líneas 2 y 3 de la función (y
La flecha verde claro ha aparecido en la línea 1). ¿Por qué es esto?
La respuesta es que la definición de función no es la misma que la
ejecución de la función. Líneas 2
y 3 no se ejecutará hasta que la función se llame en la línea 6. La
línea 1 define la función y el nombre square
se agrega al
variables globales, pero eso es todo el def
lo hace en ese punto. El cuerpo de la función se ejecutará más tarde.
Continuar haciendo clic
El botón de avance para ver cómo se mueve el flujo de control desde la
llamada, regresa al cuerpo de la función, y finalmente regresa a la
línea 7, después de que la función ha devuelto su valor y el valor se ha
asignado a squareResult
.
Finalmente, hay un aspecto más
de los valores de retorno de la función que se debe tener en cuenta.
Todas las funciones de Python devuelven el valor None
A menos que haya una declaración de devolución explícita con
un valor que no sea None.
Considere el siguiente error común cometido al comenzar Python
Programadores. A medida que atraviesa este ejemplo, preste mucha atención a la devolución
Valor en la lista de variables locales. Luego mira lo que se imprime cuando el
devoluciones de la función.
1 | Def cuadrado (x): |
2 | y = x * x |
3 | Imprima (y) # mal! ¡Debería usar retorno en su lugar! |
4 | |
5 | tosquare = 10 |
6 | SquarReResult = Square (Tosquare) |
7 | Imprimir ("El resultado de", Tosquare, "Squared Is", SquarReResult) |
siguiente linea a ejecutar
Salida de impresión (arrastre la esquina inferior derecha para cambiar el tamaño)
|
Actividad: Codelens 6.2.6 (CH04_CLSQUARE_BAD)
El problema con esta función
es que a pesar de que imprime el valor del cuadrado, ese valor no se
devolverá al lugar
donde se hizo la llamada. Dado que la línea 6 usa el valor de retorno
como el lado derecho de una declaración de asignación, la evaluación del
la función será None
. En este caso, squareResult
se referirá a ese valor después de la declaración de asignación y, por
lo tanto, el resultado impreso en la línea 7 es incorrecto. Por lo
general, las funciones devolverán valores que la persona que llama puede
imprimir o procesar de alguna otra manera.
Comprueba tu comprensión
¿Qué está mal con la siguiente definición de función:
def addEm(x, y, z):
return x + y + z
print('the answer is', x + y + z)
Actividad: 6.2.7 Opción múltiple (test_Question5_2_1)
¿Qué volverá la siguiente función?
def addEm(x, y, z):
print(x + y + z)
Actividad: 6.2.8 Opción múltiple (test_Question5_2_2)
No hay comentarios.:
Publicar un comentario