Ir al contenido principal

Definición de funciones: sintaxis y estructura

Introducción

Las funciones son bloques de código reutilizables diseñados para realizar una tarea específica. Son uno de los elementos más importantes en la programación con Python, ya que nos permiten organizar nuestro código en unidades lógicas, evitar la repetición y hacer nuestros programas más legibles y mantenibles. Imagina las funciones como pequeñas "máquinas" que aceptan datos (entradas), realizan operaciones con ellos y producen resultados (salidas).

En este artículo aprenderemos cómo definir y utilizar funciones en Python, explorando su sintaxis básica y comprendiendo los elementos estructurales que las componen. Dominar el uso de funciones es fundamental para avanzar en nuestra capacidad de escribir programas más complejos y profesionales.

Sintaxis básica de una función

En Python, una función se define utilizando la palabra clave def, seguida del nombre de la función y un par de paréntesis. La estructura básica es la siguiente:

def nombre_funcion():
    # Cuerpo de la función (instrucciones)
    # Este código se ejecutará cuando se llame a la función
    print("Mi primera función")

Para ejecutar (o "llamar") a una función, simplemente escribimos su nombre seguido de paréntesis:

# Definimos la función
def saludar():
    print("¡Hola! Bienvenido al tutorial de Python")

# Llamamos a la función
saludar()  # Salida: ¡Hola! Bienvenido al tutorial de Python

Anatomía de una función

Veamos los componentes principales de una función:

def calcular_area_rectangulo(base, altura):
    """
    Calcula el área de un rectángulo.
    
    Parámetros:
        base (float): La base del rectángulo
        altura (float): La altura del rectángulo
        
    Retorna:
        float: El área calculada
    """
    area = base * altura
    return area

Los elementos de esta función son:

  1. Palabra clave def: Indica a Python que estamos definiendo una función
  2. Nombre de la función: calcular_area_rectangulo (debe seguir las convenciones de nomenclatura de Python)
  3. Parámetros: base, altura (variables que reciben valores al llamar a la función)
  4. Docstring: El texto entre triples comillas (""") que documenta la función
  5. Cuerpo de la función: El código indentado que implementa la lógica
  6. Sentencia return: Especifica el valor que la función devuelve al ser llamada

Invocación de funciones

Para utilizar una función, debemos invocarla o llamarla:

# Definición de la función
def calcular_area_rectangulo(base, altura):
    area = base * altura
    return area

# Llamadas a la función con diferentes argumentos
area1 = calcular_area_rectangulo(5, 3)
print(f"El área del primer rectángulo es: {area1}")  # Salida: El área del primer rectángulo es: 15

area2 = calcular_area_rectangulo(7.5, 2.3)
print(f"El área del segundo rectángulo es: {area2}")  # Salida: El área del segundo rectángulo es: 17.25

Funciones sin parámetros

Las funciones más simples no necesitan recibir información:

def mostrar_menu():
    print("==== MENÚ PRINCIPAL ====")
    print("1. Comenzar juego")
    print("2. Cargar partida")
    print("3. Configuración")
    print("4. Salir")
    print("=======================")

# Llamada a la función
mostrar_menu()

Funciones que no devuelven valores

No todas las funciones necesitan devolver un valor explícitamente:

def saludar_usuario(nombre):
    print(f"Hola {nombre}, ¡bienvenido/a al programa!")
    # Esta función no tiene return

# Llamada a la función
saludar_usuario("María")  # Salida: Hola María, ¡bienvenido/a al programa!

# Si intentamos capturar un valor de retorno, obtendremos None
resultado = saludar_usuario("Carlos")
print(f"Valor devuelto: {resultado}")  # Salida: Valor devuelto: None

En Python, si una función no tiene una sentencia return o tiene un return sin valor, implícitamente devuelve None.

La sentencia return

La sentencia return tiene dos propósitos principales:

  1. Especificar el valor que la función devuelve
  2. Finalizar la ejecución de la función
def es_mayor_edad(edad):
    if edad >= 18:
        return True
    return False  # Esta línea solo se ejecuta si no se cumple la condición anterior

# Probando la función
print(es_mayor_edad(20))  # Salida: True
print(es_mayor_edad(15))  # Salida: False

Una función puede tener múltiples sentencias return, pero solo se ejecutará una de ellas:

def calificar_nota(puntuacion):
    if puntuacion < 5:
        return "Suspenso"
    elif puntuacion < 7:
        return "Aprobado"
    elif puntuacion < 9:
        return "Notable"
    else:
        return "Sobresaliente"

# Probando diferentes puntuaciones
print(calificar_nota(4.5))  # Salida: Suspenso
print(calificar_nota(6.7))  # Salida: Aprobado
print(calificar_nota(9.2))  # Salida: Sobresaliente

Docstrings: documentando funciones

Es una buena práctica documentar nuestras funciones utilizando docstrings (cadenas de documentación):

def calcular_iva(precio, porcentaje=21):
    """
    Calcula el IVA de un precio dado.
    
    Esta función aplica el tipo de IVA indicado a un precio
    y devuelve el importe del impuesto.
    
    Args:
        precio (float): El precio base sin IVA
        porcentaje (int, opcional): El porcentaje de IVA a aplicar. Por defecto es 21
        
    Returns:
        float: El importe del IVA calculado
    """
    return precio * (porcentaje / 100)

# Usando la función
producto_precio = 100
iva = calcular_iva(producto_precio)
print(f"Precio: {producto_precio}€")
print(f"IVA (21%): {iva}€")
print(f"Total: {producto_precio + iva}€")

# También podemos consultar la documentación
help(calcular_iva)  # Muestra la documentación de la función

Convenciones de nomenclatura

En Python, las funciones suelen seguir estas convenciones:

  • Nombres en minúsculas
  • Palabras separadas por guiones bajos (snake_case)
  • Nombres descriptivos que indiquen qué hace la función
# Bueno: nombre descriptivo y snake_case
def calcular_promedio_notas(lista_notas):
    return sum(lista_notas) / len(lista_notas)

# Malo: no descriptivo y camelCase
def calFunc(x):
    return sum(x) / len(x)

Indentación y estructura de las funciones

Python utiliza la indentación para delimitar bloques de código. En las funciones, el cuerpo debe estar indentado (generalmente con 4 espacios):

def es_primo(numero):
    # Casos especiales
    if numero <= 1:
        return False
    if numero <= 3:
        return True
    
    # Si es divisible por 2 o 3, no es primo
    if numero % 2 == 0 or numero % 3 == 0:
        return False
    
    # Comprobar divisibilidad por números de la forma 6k±1
    i = 5
    while i * i <= numero:
        if numero % i == 0 or numero % (i + 2) == 0:
            return False
        i += 6
    
    return True

# Probamos la función
for n in range(1, 21):
    if es_primo(n):
        print(f"{n} es un número primo")

Funciones como ciudadanos de primera clase

En Python, las funciones son "ciudadanos de primera clase", lo que significa que pueden:

  1. Asignarse a variables
  2. Pasarse como argumentos a otras funciones
  3. Devolverse como resultado de otras funciones
# Asignar función a una variable
def duplicar(x):
    return x * 2

operacion = duplicar
print(operacion(5))  # Salida: 10

# Función que acepta otra función como argumento
def aplicar_operacion(func, valor):
    resultado = func(valor)
    print(f"El resultado es: {resultado}")

# Usando la función
aplicar_operacion(duplicar, 8)  # Salida: El resultado es: 16

Funciones anidadas

Python permite definir funciones dentro de otras funciones:

def calculadora(operacion):
    def suma(a, b):
        return a + b
    
    def resta(a, b):
        return a - b
    
    # Elegir la operación adecuada
    if operacion == "suma":
        return suma
    elif operacion == "resta":
        return resta

# Usando la función
operacion_suma = calculadora("suma")
resultado = operacion_suma(10, 5)
print(f"El resultado de la suma es: {resultado}")  # Salida: El resultado de la suma es: 15

Resumen

Las funciones son bloques de código reutilizables que nos permiten organizar nuestro programa de manera más eficiente. Hemos aprendido la sintaxis básica para definir funciones en Python, cómo utilizarlas con y sin parámetros, cómo devolver valores con la sentencia return y la importancia de documentarlas adecuadamente.

Dominar la creación y uso de funciones es un paso crucial en tu aprendizaje de Python, ya que te permite escribir código más organizado, legible y mantenible. En los próximos artículos, profundizaremos en conceptos más avanzados relacionados con las funciones, como los diferentes tipos de parámetros y el ámbito de las variables.