18 - ¿Qué es y para qué sirve una función?

Lección 18 del curso Python Nivel Básico.

Introducción

En la práctica anterior vimos cómo implementar un programa para calcular el tiempo necesario para recuperar nuestra inversión inicial en la bolsa, y allí usamos diferentes herramientas y estructuras de control aprendidas hasta el momento .

Pero muchas veces, al momento de desarrollar nuestros programas, nos daremos cuenta de que es necesario reutilizar varias porciones de código una y otra vez, y la alternativa de copiar y pegar este código varias veces no es la más adecuada.

Otra veces veremos que nuestro programa es cada vez más complejo y contendrá más y más líneas de código, y necesitamos una herramienta que nos facilite su lectura y posterior depuración.

La solución en estos casos consiste en “empaquetar” estas líneas de código en algo que se conoce como una función, lo que nos permitirá tener un programa mucho más limpio y organizado, y más fácil de entender, de depurar y de mantener.

Así que en esta lección comenzaremos a hablar de una de las estructuras fundamentales de la programación en Python: las funciones.

Veremos qué son, cuál es su utilidad y qué ventajas ofrecen frente a alternativas menos eficientes como por ejemplo la de copiar y pegar o implementar la totalidad del código de forma secuencial como lo hemos venido haciendo hasta el momento.

Suscríbete para tener acceso al video con la explicación detallada de esta lección. Además podrás disfrutar de todos los cursos de la Academia Online

Planteamiento del problema

Supongamos que hemos desarrollado un programa en donde solicitamos al usuario introducir un total de 3 números, y a partir de estos la idea es determinar cuál tiene el mayor valor.

Con lo que hemos aprendido hasta el momento, el programa tendría una estructura similar a esta:

# Datos introducidos por el usuario
n1 = float(input('Introduzca el dato 1: '))
n2 = float(input('Introduzca el dato 2: '))
n3 = float(input('Introduzca el dato 3: '))

# Determinar cuál es el número mayor
if (n1 >= n2) and (n1 >= n3):
    mayor = n1
elif (n2 >= n1) and (n2 >= n3):
    mayor = n2
else:
    mayor = n3

print(f'El número mayor es: {mayor}')

calcular_maximo()

Y ahora supongamos que este mismo cálculo queremos hacerlo varias veces en diferentes partes del programa. Con las herramientas aprendidas hasta el momento, esto implicaría que debemos tomar el código anterior y literalmente copiarlo y pegarlo tantas veces como sea necesario. Esto implica que debemos tomar las 3 líneas de código de la introducción de datos y las 7 líneas de código para determinar el número mayor, es decir 10 en total, y replicarlas una y otra vez en nuestro programa.

Ahora analicemos un segundo programa:

# Datos introducidos por el usuario
n1 = float(input('Introduzca el dato 1: '))
n2 = float(input('Introduzca el dato 2: '))
n3 = float(input('Introduzca el dato 3: '))

# Realizar operaciones sobre los datos
suma = n1 + n2 + n3
resta = n1 - n2 - n3
multip = n1*n2*n3

# Imprimir resultados
print(f'Resultado suma: {suma}')
print(f'Resultado resta: {resta}')
print(f'Resultado multiplicación: {multip}')

En este caso tenemos también un programa secuencial (es decir una instrucción después de otra), y vemos que esencialmente existen tres bloques de código encargados de diferentes tareas: el primero acepta los datos introducidos por el usuario, mientras que los dos restantes realizan operaciones sobre estos datos e imprimen los resultados.

Como veremos a continuación, la replicación de código (del primer ejemplo) o la programación secuencial (del segundo ejemplo) no son enfoques recomendables para el desarrollo de nuestros programas.

Las desventajas de copiar y pegar porciones de código

Veamos los inconvenientes que tiene el hecho de copiar y pegar una y otra vez las 10 líneas de código en nuestro programa, de acuerdo a lo mencionado en el ejemplo 1:

  1. Nuestro programa tendrá cada vez más líneas de código, dependiendo de cuántas veces repliquemos la porción original. Así, si debemos reutilizar este código 5 veces, esto implicará un total de 50 líneas de código adicionales en nuestro programa. El inconveniente de esto es que estaremos incrementando innecesariamente el tamaño de nuestro programa, pues siempre estaremos usando la misma porción de código una y otra vez. Esto hará el programa más difícil de leer y de entender.
  2. La depuración del programa será más compleja. ¿Qué pasa si por ejemplo decidimos que en lugar de 3 serán 4 los datos introducidos por el usuario? Esto implicaría que tendremos que añadir otra línea a la porción de código original, pero como éste se ha replicado 5 veces, tendremos que repetir este procedimiento 5 veces para que todo funcione correctamente. Este proceso de depuración tampoco es eficiente, pues está mucho más propenso a errores.

Así que debería existir una forma más eficiente de reutilizar este código, sin necesidad de replicarlo, evitando así tener un programa innecesariamente extenso y facilitando el proceso de lectura y depuración del código.

Las desventajas de la programación secuencial

En el segundo ejemplo el programa tenía muy pocas líneas y resultaba fácil de entender y de depurar. Pero si tuviésemos un programa mucho más extenso, con muchas más líneas de código, el proceso sería más complejo, pues un pequeño cambio en una línea de código podría afectar las líneas de código restantes y verificar que los cambios realizados funcionan correctamente no es una tarea fácil si nuestro programa es extenso.

Lo ideal sería poder crear pequeños módulos encargados de tareas específicas, lo cual facilitaría considerablemente la lectura y depuración de nuestro programa.

Si analizamos lo discutido en los ejemplos 1 y 2 concluímos que estos enfoques no son los más eficientes. Pero ¿existe una mejor forma de hacerlo? Pues la respuesta es sí, efectivamente existe una alternativa mucho más eficiente, y es precisamente usando funciones.

¿Qué es una función?

Esencialmente una función es una porción de código diseñada para cumplir una tarea específica. La ventaja es que a dicha función podemos darle un “alias” (es decir el nombre de la función) y luego llamarla desde nuestro programa tantas veces como sea necesario sin necesidad de replicar el código.

Así que con una función lo que haremos es “empaquetar” la porción de código deseada para reutilizarla tantas veces como sea necesario en nuestro código.

Entendamos este concepto de función a través de un ejemplo.

Ejemplo de una función en Python

Volviendo al primer ejemplo, podemos reescribir la porción de código como una función de la siguiente manera:

def calcular_maximo():
    # Datos introducidos por el usuario
    n1 = float(input('Introduzca el dato 1: '))
    n2 = float(input('Introduzca el dato 2: '))
    n3 = float(input('Introduzca el dato 3: '))

    # Determinar cuál es el número mayor
    if (n1 >= n2) and (n1 >= n3):
        mayor = n1
    elif (n2 >= n1) and (n2 >= n3):
        mayor = n2
    else:
        mayor = n3

    print(f'El número mayor es: {mayor}')
    

En este caso hemos “empaquetado” la porción de código de interés en una función que se llama calcular_maximo. Así que si queremos reutilizar este código más adelante en nuestro programa, no será necesario copiarlo y pegarlo y en su lugar será suficiente con llamar la función, que equivale simplemente a escribir su nombre dentro de nuestro programa: calcular_maximo()

Así que si volvemos al problema inicial, en donde queríamos reutilizar nuestro código 5 veces, pasaremos de:

Es decir que con el uso de la función hemos logrado reducir el número de líneas requerido en nuestro programa.

Y podemos hacer algo similar con el ejemplo 2 en nuestro programa secuencial. En este caso podemos crear un módulo (¡es decir una función!) encargado de una tarea específica, que se encargue de realizar operaciones sobre los datos e imprimir los resultados. Con esto facilitaremos el mantenimiento y posterior depuración de nuestro programa:

# Función realizar operaciones e imprimir resultados
def operaciones(nro1, nro2, nro3):
	suma = nro1 + nro2 + nro3
	resta = nro1 - nro2 - nro3
	multip = nro1 * nro2 * nro3

	print(f'Resultado suma: {suma}')
	print(f'Resultado resta: {resta}')
	print(f'Resultado multiplicación: {multip}')

# Y ahora sí nuestro programa:

# Introducir datos desde el teclado
n1 = float(input('Introduzca el dato 1: '))
n2 = float(input('Introduzca el dato 2: '))
n3 = float(input('Introduzca el dato 3: '))

# Y llamar la función que acabamos de crear
operaciones(n1, n2, n3)

De esta forma, creando funciones (es decir empaquetando porciones de código encargadas de realizar tareas específicas), tendremos un código más organizado, más fácil de entender, más fácil de modificar y de depurar.

Recuerda suscribirte para acceder al video con la explicación detallada de esta lección. Además podrás disfrutar de todos los cursos de la Academia Online

Conclusión

Bien, ya tenemos claro el concepto de función, que como vimos es una porción de código encargada de una tarea específica y que podemos empaquetar y luego llamar tantas veces como queramos desde nuestro programa.

La ventaja de usar funciones es que nos permitirán tener un código más compacto y mucho más organizado así como fácil de depurar y mantener.

Así que les sugiero usar funciones siempre que veamos porciones de código que se puedan reutilizar o siempre que necesitemos crear módulos en nuestro programa encargados de tareas específicas.

Entonces, teniendo claro qué es y para qué sirve una función, en la siguiente lección veremos todos los detalles de cómo crear una función en Python.

Ver todas las lecciones de este curso