10. Funciones

Una función en programación refiere a una sección de un programa que calcula un valor de manera independiente al resto del programa. En otras palabras esta sección representa a un 'subprograma' o 'mini programa' con acciones repetitivas o con partes de código que son escritas una vez para ser accedida tantas veces sea necesario.

En general una función tiene cuatro componentes importantes:

  • Un nombre único que identifique a la función dentro del programa. Al ser un nombre único se debe considerar que el tipo de declaración incluye a que no se deben nombrar variables, constantes o cualquier elemento posible con el mismo de la función.

  • Parámetros o valores que recibe la función como entrada y son necesarios para cumplir la acción.

  • Cuerpo o código de la función, que son declaraciones propias que ejecuta la función.

  • Resultados o el valor de retorno.

El segundo, tercer y cuarto componente son análogos a la entrada, proceso y la salida de un programa.

En programación existe el concepto denominado procedimientos que para Python podría decirse que es solo conceptual y técnicamente no se hace mención en la literatura oficial. La diferencia entre un procedimiento y función radica en que está última ejecuta una operación y retorna un valor, y por otro lado el procedimiento ejecuta una acción pero no retorna un valor.

El retornar un valor es relevante, ya que por ejemplo una variable puede tomar o cambiar sus valores al momento de ejecutar una función pudiendo afectar a todo el programa. Por otro lado el procedimiento solo ejecuta y puede mostrar el resultado por medio de una salida (pantalla) no distribuyendo el valor ni tampoco afectando a variables dentro del programa que se ha construido.

Podemos resumir lo anterior en:

  • Los procedimientos que ejecutan un código sin devolver ningún resultado.

  • Las funciones que ejecutan un código y devuelven el resultado al código que las llamó.

10.1. Definiendo funciones

En Python las funciones son creadas mediante la sentencia "def"

Sintaxis

def nombre(parametros):
    # código de la función

Ejemplo

#!/usr/bin/env python3
# -*- coding:utf-8 *-*


def calculo_area_triangulo(base, altura):
    "Función que cálcula el área de un triángulo"
    area = base * altura
    return area


# Programa principal o main
base = int(input("Ingrese la base para el triángulo: "))
altura = int(input("Ingrese la altura para el triángulo: "))

area_triangulo = calculo_area_triangulo(base, altura)
print("El cálculo del área del triángulo es: ", area_triangulo)

Salida

Ingrese la base para el triángulo: 3
Ingrese la altura para el triángulo: 5
El cálculo del área del triángulo es:  15

La función denominada "calculo_area_triangulo" recibe dos parámetros (base, altura) y a partir de estos parámetros se realiza una operación de múltiplicación que cumple con lo deseado. Importante es resaltar que teóricamente "calculo_area_triangulo" es una función porque posterior a la operación matemática (base * altura) cuyo valor que es asignado a la variable "area" es retornado por la función y es asignado a la variable "area_triangulo" desde el lugar del programa donde ha sido llamada la función. Luego a través de la función "print" se muestra el resultado de la variable "area_triangulo" por pantalla.

Ejemplo

#!/usr/bin/env python3
# -*- coding:utf-8 *-*


def calculo_area_triangulo(base, altura):
    "Procedimiento que cálcula el área de un triángulo"
    area = base * altura
    print("El cálculo del área del triángulo es: ", area)


# Programa principal o main
base = int(input("Ingrese la base para el triángulo: "))
altura = int(input("Ingrese la altura para el triángulo: "))

calculo_area_triangulo(base, altura)

Salida

Ingrese la base para el triángulo: 3
Ingrese la altura para el triángulo: 5
El cálculo del área del triángulo es:  15

Como ha sido explicado, en la definición de un procedimiento no existe un valor que retorne una vez ejecutada la rutina y es por eso que no existirá la palabra reservada de Python "return". Otra diferencia y tiene mucho que ver con el punto anterior, es que para el llamado al procedimiento no se requiere de una variable, simplemente se hace la declaración del llamado y se ejecuta cada una de las lineas de sintaxis del procedimiento.

10.2. Parámetros

Los parámetros son valores que se traspasan a un procedimiento o una función para que puedan ser usados como valores propios para ese fragmento de programa. Algo muy importante de considerar es que para utilizar los parámetros en un procedimiento o función debemos declarar su identificador, de la misma forma que declaramos una variable en cualquier momento de nuestro programa.

Para los ejemplos expuestos se hace muy fácil hacer ese seguimiento, pues se ha hecho instancia de la función, en donde el primer valor corresponde a la variable base, que corresponde al primer parámetro que recibe la función "calculo_area_triangulo" también denominada base y el segundo para ambos lados se le llama altura. Esto es mera coincidencia, y a modo de ejemplo, puesto a que el nombre de las variables y parámetros no necesariamente tienen que ser el mismo.

#!/usr/bin/env python3
# -*- coding:utf-8 *-*


def calculo_area_triangulo(base, altura):
    "Procedimiento que cálcula el área de un triángulo"
    resultado = base * altura
    print("El cálculo del área del triángulo es: ", resultado)


# Programa principal o main
variable_uno = int(input("Ingrese la base para el triángulo: "))
variable_dos = int(input("Ingrese la altura para el triángulo: "))

calculo_area_triangulo(variable_uno, variable_dos)

Acá el valor de variable uno, al momento de llamar o generar la instancia a la función, se le asignará el valor al primer parámetro que le corresponde a la función, en este caso a base y variable dos a altura.

Otra consideración es la cantidad de variables, en este caso las variables de base y altura no poseen un valor por defecto, por lo que si no coinciden en cantidad arrojará un error de excepción.

Por último se debe conocer que la variable que se recibe tiene un ámbito local dentro de la función, es decir solo la puede usar en esa función, en el siguiente ejemplo existe un error, pues en el programa principal se está imprimiendo una variable no conocida ("resultado")

#!/usr/bin/env python3
# -*- coding:utf-8 *-*


def calculo_area_triangulo(base, altura):
    "Procedimiento que cálcula el área de un triángulo"
    resultado = base * altura
    print("El cálculo del área del triángulo es: ", resultado)


# Programa principal o main
base = int(input("Ingrese la base para el triángulo: "))
altura = int(input("Ingrese la altura para el triángulo: "))

calculo_area_triangulo(base, altura)
print(resultado)

10.3. Valores por defecto

Se pueden establecer valores por defecto a cada uno de los parámetros de nuestras funciones, esto siempre en caso de requerido.

Ejemplo:

#!/usr/bin/env python3
# -*- coding:utf-8 *-*


def calculo_area_triangulo(base=1, altura=1):
    "Función que cálcula el área de un triángulo"
    resultado = base * altura
    return resultado


# Programa principal o main
base = 5
altura = 10
# llama función sin parámetros
resultado = calculo_area_triangulo()
print("El cálculo del área del triángulo es: ", resultado)

# llama función solo con un parámetro
resultado = calculo_area_triangulo(base)
print("El cálculo del área del triángulo es: ", resultado)

Para este ejemplo, la función "calculo_area_triangulo" recibe dos parámetros cuyos valores por defecto es 1, si prestamos atención al ejemplo, en la linea que se hace instancia a la función

resultado = calculo_area_triangulo()

Se realiza sin ningún parámetro, esto no arrojará error, pues hemos definido que para cada uno de los parámetros de la función tenga un valor defecto (uno). Esto quiere decir que cuando no este presente el parámetro se asumirá ese valor definido por defecto.

10.4. Posición de los parámetros

La posición de los parámetros es importante considerarla, pero no siempre es tan importante, pues nosotros al momento de instanciar a la función, podemos referir al nombre del parámetro y entregar un valor, independiente del orden en como se ubiquen.

Ejemplo:

#!/usr/bin/env python3
# -*- coding:utf-8 *-*


def calculo_area_triangulo(base=1, altura=1):
    "Función que cálcula el área de un triángulo"
    print("El valor del parámetro base es: ", base)
    print("El valor del parámetro altura es: ", altura)
    resultado = base * altura
    return resultado


# Programa principal o main
resultado = calculo_area_triangulo(altura=10, base=5)
print("El cálculo del área del triángulo es: ", resultado)

La salida esperada es:

El valor del parámetro base es:  5
El valor del parámetro altura es:  10
El cálculo del área del triángulo es:  50

Hemos incluido a diferencia de los ejemplos anteriores un paso de parámetros distinto en cuanto a su orden. En primer lugar el parámetro altura, y en segundo lugar base. Aún así nuestra función los asume de forma correcta, pues estamos asignando directamente a los parámetros requeridos los valores que les corresponderá a cada uno.

10.5. Beneficios del uso de funciones

Los procedimientos y funciones operan sobre el mismo principio de escribir un pequeño fragmento de código que se puede llamar tantas veces sea necesario en lugar de escribir el mismo código en varios partes en un programa. A esto se le llama pensar en programación modular o programar por acciones.

Un beneficio de utilizar esta práctica es que reduce el tamaño del programa, además, normalmente mejora la legibilidad del código consiguiendo muchas veces crear un programa en cuanto escritura mejor elaborado y mantenible en el tiempo. Un ejemplo de ello es realizar un cambio en el código, ya que en el caso de escribir el mismo código en varios lugares se hace más complejo aplicar ese cambio, debido a que muchos lugares deben ser modificados. Si por contraparte se decide utilizar una función, el cambio se aplicaría a un solo lugar, aligerando el trabajo y disminuyendo el margen de error por omisión.