def y return: definir y llamar funciones en Python
Las funciones son la unidad fundamental de reutilización. def define, return entrega el resultado. En Python también puedes retornar múltiples valores — algo que otros lenguajes envidian.
Sintaxis de def
Una función se define con def, seguido del nombre, paréntesis con los parámetros y dos puntos. El cuerpo va indentado:
# Función sin parámetros
def saludar():
print("¡Hola, mundo!")
saludar() # llamar la función
# Función con parámetros
def saludar_a(nombre):
print(f"¡Hola, {nombre}!")
saludar_a("Fernando")
saludar_a("Ana")
# Función con anotaciones de tipo (buena práctica)
def sumar(a: int, b: int) -> int:
return a + b
resultado = sumar(3, 4)
print(resultado) # 7
# Las anotaciones no son obligatorias, pero documentan la intención
def calcular_area(base: float, altura: float) -> float:
"""Calcula el área de un rectángulo."""
return base * altura
area = calcular_area(5.0, 3.0)
print(f"Área: {area}") # Área: 15.0
¡Hola, mundo!
¡Hola, Fernando!
¡Hola, Ana!
7
Área: 15.0Si una función no tiene return (o tiene return sin valor), Python devuelve None automáticamente. Esto es diferente de un error — simplemente significa que la función no produce un valor.
return y retorno múltiple
return termina la función y devuelve un valor. Python permite retornar múltiples valores usando una tupla:
# return simple
def cuadrado(n: float) -> float:
return n ** 2
print(cuadrado(5)) # 25.0
# return múltiple — Python retorna una tupla
def min_max(numeros: list) -> tuple[int, int]:
return min(numeros), max(numeros)
datos = [3, 1, 4, 1, 5, 9, 2, 6]
# Recibir como tupla
resultado = min_max(datos)
print(resultado) # (1, 9)
# Desempaquetar directamente
minimo, maximo = min_max(datos)
print(f"Min: {minimo}, Max: {maximo}")
# return temprano para salir antes
def dividir(a: float, b: float) -> float | None:
if b == 0:
print("Error: división por cero")
return None # ← return temprano
return a / b
print(dividir(10, 2)) # 5.0
print(dividir(10, 0)) # Error: división por cero → None
25.0
(1, 9)
Min: 1, Max: 9
5.0
Error: división por cero
NoneDocstrings en funciones
Un docstring describe el propósito de la función, sus parámetros y lo que retorna. Es la documentación que help() y los editores muestran:
def calcular_imc(peso_kg: float, altura_m: float) -> float:
"""Calcula el Índice de Masa Corporal (IMC).
Args:
peso_kg: Peso en kilogramos.
altura_m: Altura en metros.
Returns:
El IMC redondeado a 2 decimales.
Raises:
ValueError: Si la altura es cero o negativa.
Examples:
>>> calcular_imc(70, 1.75)
22.86
"""
if altura_m <= 0:
raise ValueError("La altura debe ser positiva")
return round(peso_kg / (altura_m ** 2), 2)
imc = calcular_imc(70, 1.75)
print(f"IMC: {imc}") # IMC: 22.86
# Ver el docstring
print(calcular_imc.__doc__)
IMC: 22.86Funciones como valores
En Python, las funciones son objetos de primera clase: puedes asignarlas a variables, pasarlas como argumentos y devolverlas desde otras funciones:
def doblar(n: int) -> int:
return n * 2
def triplicar(n: int) -> int:
return n * 3
# Asignar una función a una variable
operacion = doblar
print(operacion(5)) # 10
operacion = triplicar
print(operacion(5)) # 15
# Pasar funciones como argumentos
def aplicar(func, valor):
return func(valor)
print(aplicar(doblar, 7)) # 14
print(aplicar(triplicar, 7)) # 21
# Función que devuelve otra función
def crear_multiplicador(factor):
def multiplicar(n):
return n * factor
return multiplicar
por_cinco = crear_multiplicador(5)
por_diez = crear_multiplicador(10)
print(por_cinco(3)) # 15
print(por_diez(3)) # 30
10
15
14
21
15
30Practica
Cuatro ejercicios para dominar la definición de funciones en Python.