QuieroProgramar por Rodri Gonzalez
Python · Lección 18 de 27

Funciones básicas

Las funciones te permiten encapsular lógica reutilizable bajo un nombre descriptivo. En vez de copiar y pegar código, lo definís una vez y lo llamás cuantas veces quieras. Es el salto de "scripts sueltos" a "código profesional".

90–110 min Prerrequisitos: 06 Condicionales, 16-17 Bucles
01

Concepto teórico

¿Qué es una función?

Una función es un bloque de código con nombre que recibe datos (parámetros), los procesa y opcionalmente devuelve un resultado (return). Definís la función una vez con def y después la llamás cuantas veces quieras pasándole distintos datos.

def nombre_funcion(parametro1, parametro2):
    """Docstring: qué hace la función."""
    # lógica
    resultado = parametro1 + parametro2
    return resultado

# Llamar la función
x = nombre_funcion(10, 20)  # x = 30
Principio DRY — Don't Repeat Yourself: si copiás y pegás el mismo bloque de código más de una vez, necesitás una función. Cada vez que dupliques código, duplicás los bugs potenciales. Con una función, corregís en un solo lugar y la corrección se aplica en todos los puntos donde se llama.

Anatomía de una función

Parámetros vs argumentos

Técnicamente: los parámetros son los nombres en la definición (def f(x, y)); los argumentos son los valores que pasás al llamar (f(10, 20)). En la práctica, la gente usa ambos términos indistintamente.

Python soporta dos formas de pasar argumentos:

Valores por defecto

Podés darle valores por defecto a los parámetros. Si el llamador no los pasa, se usa el default:

def calcular_iva(precio, tasa=0.21):
    return precio * (1 + tasa)

calcular_iva(1000)           # usa tasa=0.21 → 1210.0
calcular_iva(1000, 0.105)    # usa tasa=0.105 → 1105.0
Regla de oro: los parámetros con default siempre van DESPUÉS de los que no tienen default. def f(a, b=10) ✅. def f(a=10, b) ❌ SyntaxError.
Trampa peligrosa: NUNCA uses un objeto mutable (lista, dict) como valor por defecto. def f(datos=[]) es un bug clásico: la lista se comparte entre todas las llamadas. Usá def f(datos=None): if datos is None: datos = [].

Return: devolver valores

return hace dos cosas: (1) devuelve un valor al llamador, y (2) termina la ejecución de la función inmediatamente. Todo lo que haya después del return NO se ejecuta.

Una función puede devolver múltiples valores como tupla: return a, b, c. El llamador los desempaqueta: x, y, z = funcion().

Si no hay return (o hay return sin valor), la función devuelve None.

Analogía financiera: una función es como una fórmula de Excel con nombre. =CALCULAR_IVA(A1, 0.21) recibe una celda y una tasa, procesa internamente, y devuelve el resultado. No necesitás saber cómo calcula — solo sabés que funciona. Encapsulación.

Type hints: documentar tipos

Python permite anotar los tipos esperados de parámetros y retorno. No fuerzan nada (Python sigue siendo dinámico), pero documentan la intención y habilitan herramientas como Pylance para detectar errores:

def calcular_cuota(capital: float, tasa: float, meses: int) -> float:
    """Calcula cuota simple."""
    return (capital * (1 + tasa)) / meses
En el trabajo real: en equipos profesionales, las funciones son la unidad básica de organización del código. Un pipeline de datos se estructura como una cadena de funciones: leer_csv() → limpiar_datos() → calcular_metricas() → generar_reporte(). Cada función hace UNA cosa bien (principio de responsabilidad única).
Tip de naming: las funciones hacen algo, así que nombralas con verbos: calcular_iva(), filtrar_clientes(), generar_reporte(). Las variables son sustantivos: saldo, cliente, tasa. Verbos para funciones, sustantivos para datos.
02

Ejemplos explicados paso a paso

Ejemplo 1: Definir y llamar funciones básicas

ejemplo_01_basico.pyPython

        
Hacé clic en ▶ Ejecutar

Ejemplo 2: Return múltiple y docstrings

ejemplo_02_return_docs.pyPython

        
Hacé clic en ▶ Ejecutar

Ejemplo 3: DRY — de código repetido a funciones

ejemplo_03_dry.pyPython

        
Hacé clic en ▶ Ejecutar

Ejemplo 4: Funciones con type hints y validación

ejemplo_04_typehints.pyPython

        
Hacé clic en ▶ Ejecutar

Ejemplo 5: Funciones como pipeline

ejemplo_05_pipeline.pyPython

        
Hacé clic en ▶ Ejecutar
03

Referencia rápida

Concepto Sintaxis Ejemplo
Definir def nombre(params): def sumar(a, b):
Llamar nombre(args) sumar(3, 5)
Return return valor return a + b
Return múltiple return a, b Devuelve tupla
Default def f(x, y=10): y es opcional, vale 10
Keyword arg f(y=20, x=5) Nombrás el parámetro
Docstring """Descripción.""" Primera línea del cuerpo
Type hint def f(x: int) -> str: Documentar tipos
Sin return Devuelve None
Buena práctica Ejemplo
Nombres con verbos calcular_iva, filtrar_clientes
Una responsabilidad Cada función hace UNA cosa
DRY: no repetir código Si copiás un bloque, creá una función
Docstring siempre Args, Returns, descripción
No mutar argumentos No modificar listas/dicts que te pasan
Return temprano if error: return None al inicio
04

Ejercicios

Nivel 1 · Básico

Ejercicio 1: Función con IVA

Creá con_iva(precio) que devuelva el precio + 21%. Probá con $10,000. Debe incluir 12100.

ejercicio_01.pyDebe incluir "12100"

          
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

Ejercicio 2: Función con parámetro default

Creá saludar(nombre, saludo="Hola") que imprima "{saludo}, {nombre}!". Probá con y sin saludo. Debe incluir Hola, García.

ejercicio_02.pyDebe incluir "Hola, García"

          
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

Ejercicio 3: Return múltiple

Creá min_max(numeros) que devuelva el mínimo y máximo como tupla. Probá con [45, 72, 38, 91, 55]. Debe incluir 38.

ejercicio_03.pyDebe incluir "38"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 4: Sueldo neto con función

Creá sueldo_neto(bruto, jub=0.11, os=0.03, gan=0.17). Calculá el neto de $750,000. Debe incluir 517500.

ejercicio_04.pyDebe incluir "517500"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 5: Función con docstring completo

Creá interes_simple(capital, tasa, meses) con docstring que incluya Args y Returns. Calculá para $200,000 al 5% por 6 meses. Debe incluir 60000.

ejercicio_05.pyDebe incluir "60000"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 6: Función clasificadora

Creá clasificar_score(score) que devuelva "Excelente" (>=800), "Bueno" (>=700), "Regular" (>=600) o "Malo". Probá con 720. Debe incluir Bueno.

ejercicio_06.pyDebe incluir "Bueno"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 7: Función que procesa lista

Creá limpiar_montos(lista_str) que reciba ["$1,500","N/A","$3,200"] y devuelva una lista de floats (saltando inválidos). Debe incluir 4700.

ejercicio_07.pyDebe incluir "4700"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 8: Función que devuelve diccionario

Creá analizar(saldos) que devuelva un dict con total, promedio, min, max, cantidad. Debe incluir promedio.

ejercicio_08.pyDebe incluir "promedio"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 9: Funciones como pipeline

Creá 3 funciones: limpiar(texto) que stripee y titlece, validar(nombre) que verifique que tiene al menos 2 caracteres, y formatear(nombre, i) que devuelva "N. Nombre". Aplicá las 3 a una lista sucia. Debe incluir García.

ejercicio_09.pyDebe incluir "García"

          
Hacé clic en ▶ Ejecutar
Nivel 4 · Desafío

Ejercicio 10: Motor de evaluación crediticia como funciones

Creá un mini motor de crédito con funciones: validar_edad(e), validar_ingreso(i), validar_score(s), calcular_ratio(cuota, ingreso), y evaluar_cliente(nombre, edad, ingreso, score, cuota) que las use todas. Probá con 3 clientes. Debe incluir EVALUACIÓN.

ejercicio_10_desafio.pyDebe incluir "EVALUACIÓN"

          
Hacé clic en ▶ Ejecutar
05

Resumen y conexión

En la siguiente lección (19 · Funciones avanzadas) vas a aprender *args/**kwargs, lambda, funciones como objetos, closures, decoradores y generators — las herramientas que separan código junior de código senior.

Recursos: Python docs — Functions · PEP 257 — Docstrings