Funciones

Definición y uso de funciones

¿Qué es una función?

Una función es un bloque de código reutilizable con un nombre específico, que puede recibir cero o más parámetros de entrada, ejecutar un conjunto de instrucciones y retornar un valor o simplemente realizar una acción. Este bloque puede ser llamado en cualquier parte del programa cuantas veces sea necesario, lo que permite estructurar mejor el código y evitar la repetición.

Las funciones son un pilar fundamental del paradigma de la programación estructurada, ya que permiten:

  • Modularización: Dividir un programa complejo en unidades lógicas más simples (funciones), lo que facilita el diseño, la lectura y la depuración.
  • Reutilización: Evitar duplicación de código utilizando funciones comunes en distintos lugares del programa o incluso en diferentes programas

Python incluye muchas funciones integradas (como print(), len(), range(), etc.), pero también permite al programador definir sus propias funciones. Esto último es esencial para escribir programas limpios, organizados y fáciles de mantener.


Definiendo funciones en Python:

En Python, las funciones se definen con la palabra clave def, seguida del nombre de la función, una lista de parámetros entre paréntesis, y dos puntos : que indican el inicio del bloque de instrucciones.

Sintaxis básica:
def nombre_de_la_funcion(param1, param2, ...):
    # Bloque de código
    return valor
Ejemplo:
def saludar():
    print("Hola, mundo!")

Para ejecutar esta función, simplemente la llamamos por su nombre:

saludar() 
# Salida: Hola, mundo!

Parámetros y argumentos:

Las funciones pueden recibir datos mediante parámetros, que se especifican al definir la función. Al llamarla, se pasan los argumentos correspondientes.


Tipos de argumentos en Python:

1. Argumentos posicionales:

Son los más comunes. Los valores se asignan a los parámetros según su posición.

def sumar(a, b):
    return a + b

resultado = sumar(5, 3)
print(resultado)  # Salida: 8

Si se pasan menos o más argumentos de los requeridos, se producirá un error.

2. Argumentos con nombre (keywords):

Podemos especificar a qué parámetro corresponde cada argumento, usando clave=valor.

def restar(a, b):
    return a - b

print(restar(a=10, b=3))  # Salida: 7
print(restar(b=3, a=10))  # También válido
3. Argumentos con valores por defecto:

Permiten que un parámetro tenga un valor predeterminado si no se especifica uno al llamar la función.

def saludar(nombre="invitado"):
    print(f"Hola, {nombre}!")

saludar("Lucía")    # Salida: Hola, Lucía!
saludar()           # Salida: Hola, invitado!
4. Argumentos de longitud variable:
a) Argumentos posicionales variables (*args):

Permiten pasar cualquier cantidad de argumentos posicionales, que se almacenan como una tupla.

def sumar_todo(*numeros):
    return sum(numeros)

print(sumar_todo(1, 2, 3))         # Salida: 6
print(sumar_todo(4, 5, 6, 7, 8))   # Salida: 30
b) Argumentos nombrados variables (**kwargs):

Permiten pasar cualquier cantidad de argumentos con nombre, que se almacenan como un diccionario.

def mostrar_info(**datos):
    for clave, valor in datos.items():
        print(f"{clave}: {valor}")

mostrar_info(nombre="Ana", edad=30, ciudad="Madrid")

Retornar valores con return:

La sentencia return sirve para:

  • Finalizar la ejecución de la función.
  • Devolver valores al punto donde fue llamada.
Ejemplo con un valor:
def cuadrado(n):
    return n ** 2

resultado = cuadrado(4)
print(resultado)  # Salida: 16
Ejemplo con múltiples valores:
def operaciones(a, b):
    suma = a + b
    producto = a * b
    return suma, producto

s, p = operaciones(3, 5)
print(f"Suma: {s}, Producto: {p}")

Documentar funciones con docstrings:

Una buena práctica en programación es documentar nuestras funciones. Esto se logra usando docstrings, que son cadenas de texto encerradas entre triple comillas """ justo después de la definición de la función.

def saludar(nombre):
    """Esta función imprime un saludo personalizado.
    
    Parámetros:
    nombre (str): El nombre de la persona a saludar.
    """
    print(f"Hola, {nombre}!")

Esta documentación puede ser consultada con la función help():

help(saludar)

Anotaciones de tipo (Type Hints):

Python permite indicar el tipo de los parámetros y del valor de retorno mediante anotaciones de tipo, lo cual mejora la legibilidad y ayuda a herramientas como linters o editores de código.

def multiplicar(a: int, b: int) -> int:
    return a * b

Estas anotaciones no son obligatorias ni generan errores si se pasan tipos distintos, pero son una buena práctica para programar de forma más segura y clara.


Buenas prácticas al crear funciones:

  • Usa nombres descriptivos para tus funciones y parámetros.
  • Evita que una función haga demasiadas cosas. Cada función debe tener una única responsabilidad.
  • Incluye docstrings claros y completos.
  • Evita efectos secundarios innecesarios, como modificar variables globales dentro de una función.
  • Valida los argumentos si esperas tipos o valores específicos.