Funciones y paso de parámetros
Con carácter general, una función se puede entender como una caja negra que recibe datos de entrada y proporciona unos resultados o datos de salida. El interior de esa caja negra, es decir, el contenido de la función, estará representado por un conjunto de instrucciones, escritas en un determinado lenguaje de programación, responsables de aplicar el procesamiento necesario a los datos de entrada para generar los datos de salida.
Una de las principales ventajas de este planteamiento reside en el concepto de abstracción. En otras palabras, el programador puede abstraerse o despreocuparse del contenido o implementación de una función para centrarse directamente en cómo utilizarla. El uso de una función está asociada a la acción de “llamarla o invocarla”, para lo cual es necesario conocer la especificación de dicha función. Esta especificación o declaración comprende, típicamente, el nombre de la función, la declaración de los datos de entrada, también denominados parámetros, y la declaración del valor de retorno de la función. Este valor de retorno lo podemos vincular con los datos de salida.
La siguiente línea de código muestra la especificación o declaración de una función, escrita en el lenguaje de programación C, diseñada para sumar dos valores enteros y devolver el resultado de su suma que también será un entero. Así, esta línea refleja la cabecera o firma de la función suma
, la cual tiene dos parámetros de tipo int
, denominados a
y b
, respectivamente. Además, y como se puede observar en la primera palabra de dicha línea, el tipo del elemento que devolverá la función también es de tipo int
. Fíjate en cómo los datos de entrada, entre paréntesis de acuerdo a la sintaxis del lenguaje C, están representados por los parámetros a
y b
.
int suma(int a, int b);
En este punto, es importante recordar que existen lenguajes cuya sintaxis obliga a que el programador indique explícitamente el tipo de los datos a utilizar cuando se declara una variable o se especifica un parámetro, como ocurre con el lenguaje C. Por el contrario, otros lenguajes de programación son más flexibles y no es necesario especificar los tipos explícitamente, como ocurre con Python.
La función suma
, declarada anteriormente y que incluye los parámetros y el tipo del valor de retorno, se puede implementar de la forma que sigue:
int suma(int a, int b)
{
int resultado = a + b;
return resultado;
}
Como se puede apreciar, en la línea 3 se declara una variable resultado
, que almacena el valor resultante de sumar el contenido de a
y el contenido de b
. Posteriormente, en la línea 4, la función suma
devuelve el contenido de la variable resultado
. Fíjate cómo el tipo de esta variable, int
, coincide con el tipo de retorno de la función suma
, también int
. En este sentido, los datos de salida de la función suma
serán de tipo entero.
En este punto ya disponemos de una función que suma dos valores enteros, y que puede utilizarse desde otra parte del código abstrayéndonos de lo que tiene dentro. Recuerda la idea de entender la función como una caja negra que aplica un procesamiento alimentándose de los datos de entrada para generar un resultado de salida. El siguiente código muestra cómo se podría llamar a la función suma
:
int sumando_1 = 3, sumando_2 = 7;
int resultado_suma;
resultado_suma = suma(sumando_1, sumando_2)
En el anterior fragmento de código, el contenido de las variables sumando_1
y sumando_2
, es decir, los valores 3 y 7, respectivamente, representan los datos de entrada de la llamada a la función suma
. Más formalmente, estos valores son los argumentos que se pasan a dicha función. Aunque en documentos posteriores profundizaremos en la diferencia existente entre parámetros y argumentos, por ahora es suficiente con que asocies los parámetros a la declaración o especificación de la función y los argumentos a los valores con los que llamas o invocas a una función existente. En la segunda línea de código se declara una variable resultado_suma
, del mismo tipo que el valor devuelto por la función suma
.
Finalmente, la tercera línea del ejemplo anterior permite almacenar, en la variable resultado_suma
, el resultado devuelto por la función suma
cuando esta finaliza su ejecución.
Como ejemplo adicional, la función que se expone a continuación, denominada sqrtf
y pensada para calcular la raíz cuadrada de un número decimal, tiene en este caso un único parámetro de tipo float
(que permite manejar decimales).
float sqrtf(float a);
Como puedes ver, el único parámetro de esta función, denominado a, tiene asociado un tipo de datos diferente al del ejemplo anterior. Lo mismo ocurre con el tipo del valor de retorno (palabra clave float
antes del nombre de la función).
Otros lenguajes de programación, como Python, emplean un enfoque más directo en lo que a especificación de tipos de datos se refiere. Por el contrario, hay lenguajes de programación, como C, que imponen la necesidad de especificar los tipos de datos asociados a los parámetros de nuestras funciones. En este sentido, la implementación de la anterior función suma
, en Python, podría ser la siguiente:
def suma(a, b):
resultado = a + b;
return resultado;
A la hora de invocar a esta función en Python, podríamos usar el siguiente código:
suma(3, 7)
10
En este ejemplo, los parámetros a
y b
de la función suma
no tienen asociado un tipo concreto. Sin embargo, a la hora de invocar la función suma
y de pasarle los argumentos 3 y 7, sí que se maneja implícitamente un tipo de datos concreto (números enteros).