Funciones en Python
Ya sabes repetir instrucciones con bucles y tomar decisiones con condicionales. El siguiente paso es organizar tu código: en vez de copiar y pegar el mismo bloque de instrucciones cada vez que lo necesitas, lo empaquetas una sola vez dentro de una función y la llamas todas las veces que haga falta.
Bienvenido
Ya usaste funciones durante todo este curso sin definir ninguna propia: print(), input(), len(), int() son funciones que Python ya trae incorporadas. Ahora vas a aprender a escribir las tuyas con def, para dejar de repetir código y empezar a organizar tus programas en bloques reutilizables.
Al finalizar esta guía sabrás definir funciones con def, pasarles parámetros (con y sin valor por defecto), devolver resultados con return, y entender qué variables existen solo dentro de una función y cuáles siguen existiendo afuera (el scope o ámbito).
Todos los bloques con el encabezado Python son editables: presiona ✏️ Editar para modificar el código y ▶ Ejecutar para correrlo de verdad en tu navegador (usa Pyodide, un Python real compilado a WebAssembly). La primera ejecución tarda unos segundos porque descarga el intérprete. Si estás resolviendo la guía desde un lanzamiento de ATENZA, además aparece el botón 📨 Enviar para revisión una vez que el código corra sin errores, para mandar ese ejercicio al docente (no se autocorrige).
Además del código, esta guía tiene 2 preguntas conceptuales cortas para chequear que entendiste bien la diferencia entre parámetro y argumento, y cómo funciona el scope.
📖 Aprende
Cómo empaquetar instrucciones dentro de una función con def y ejecutarlas llamándola por su nombre.
💻 Practica
Ejemplos editables y ejecutables en cada sección.
🎯 Domina
Parámetros, valores por defecto, return y el ámbito (scope) de las variables.
¿Qué es una función?
Una función es un bloque de código con nombre propio que puedes ejecutar tantas veces como quieras, sin volver a escribirlo. Se define con def, seguido del nombre, paréntesis y dos puntos —igual que if o while, el bloque va indentado debajo.
def saludar():
print("¡Hola! Bienvenido al curso de POO.")
saludar()
saludar()
Salida:
¡Hola! Bienvenido al curso de POO. ¡Hola! Bienvenido al curso de POO.
La línea def saludar(): no imprime nada por sí sola: solo le enseña a Python la "receta". El código de adentro recién se ejecuta cuando llamas a la función escribiendo su nombre seguido de paréntesis, saludar() —y se ejecuta una vez por cada llamada, como se ve arriba con dos llamadas seguidas.
Los nombres de función siguen la misma convención que los de variable: snake_case, en minúsculas y con guiones bajos entre palabras (calcular_promedio, no CalcularPromedio).
Parámetros
Una función se vuelve mucho más útil cuando puede recibir datos desde afuera. Esos datos se declaran entre los paréntesis de def como parámetros, y se usan como variables normales dentro del bloque.
def saludar(nombre):
print("Hola,", nombre)
saludar("Ana")
saludar("Luis")
Salida:
Hola, Ana Hola, Luis
nombre, en la definición de la función, es el parámetro: el nombre que usa la función para referirse al dato que va a recibir. "Ana", en la llamada, es el argumento: el valor real que le estás pasando en ese momento. Es una distinción de vocabulario, pero se usa todo el tiempo al leer documentación y mensajes de error.
Una función puede recibir varios parámetros, separados por comas:
def presentar(nombre, edad):
print(nombre, "tiene", edad, "años")
presentar("Marta", 20)
Con varios parámetros posicionales, Python los asigna en el mismo orden en que los escribiste al llamar la función. presentar("Marta", 20) y presentar(20, "Marta") no son lo mismo: en el segundo caso, nombre valdría 20 y edad valdría "Marta".
En el código de arriba, cuando ejecutas saludar("Ana"), ¿cómo se le llama a "Ana" en ese momento?
Valores por defecto
Un parámetro puede tener un valor por defecto, que se usa automáticamente si no le pasas un argumento para ese lugar. Así el argumento se vuelve opcional.
def potencia(base, exponente=2):
print(base, "elevado a", exponente, "es", base ** exponente)
potencia(5)
potencia(5, 3)
Salida:
5 elevado a 2 es 25 5 elevado a 3 es 125
La primera llamada no le pasa un segundo argumento, así que Python usa el valor por defecto (2). La segunda sí le pasa uno (3), y ese reemplaza al valor por defecto.
Un parámetro sin valor por defecto no puede ir después de uno que sí lo tiene: def potencia(exponente=2, base): es SyntaxError. La regla es simple: primero todos los parámetros obligatorios, y recién después los que tienen valor por defecto.
return y funciones sin retorno
return hace que la función devuelva un valor a quien la llamó, para que puedas guardarlo en una variable o usarlo en una expresión. Es distinto de print(), que solo muestra algo en pantalla pero no te da nada para reutilizar.
def es_par(numero):
return numero % 2 == 0
resultado = es_par(8)
print(resultado)
return también corta la función en el momento en que se ejecuta, sin llegar a las líneas que vengan después:
def clasificar(nota):
if nota >= 51:
return "Aprobado"
return "Reprobado"
print(clasificar(70))
print(clasificar(30))
Si una función no tiene return (o tiene return sin ningún valor), Python le asigna el valor especial None como resultado. Es un error común guardar en una variable lo que "devuelve" un print(), esperando el texto impreso:
def imprimir_doble(x):
print(x * 2)
resultado = imprimir_doble(5)
print(resultado)
Salida: imprimir_doble(5) imprime 10 en pantalla, pero como la función no tiene return, resultado termina valiendo None, no 10.
Una función también puede devolver varios valores a la vez, separados por comas —Python los empaqueta en una tupla que puedes desempaquetar directamente en variables separadas:
def dividir(a, b):
cociente = a // b
resto = a % b
return cociente, resto
c, r = dividir(17, 5)
print("Cociente:", c, "Resto:", r)
Ámbito de las variables (scope)
Una variable creada dentro de una función es local: solo existe mientras esa función se está ejecutando, y desaparece apenas termina. Intentar usarla desde afuera produce NameError.
def cuadrado(numero):
resultado = numero ** 2
return resultado
print(cuadrado(4))
print(resultado)
La primera línea funciona bien: cuadrado(4) devuelve 16. La segunda falla, porque resultado es una variable local de cuadrado y ya no existe una vez que la función terminó.
En cambio, una variable creada afuera de cualquier función (una variable global) sí se puede leer desde adentro, sin nada especial:
mensaje = "Hola desde afuera"
def mostrar():
print(mensaje)
mostrar()
Ahora bien: leer una variable global es distinto de asignarle un valor. Si dentro de una función escribes edad = 30, aunque exista una variable global con el mismo nombre, Python crea una variable local nueva y separada —no toca la global.
edad = 25
def cambiar_edad():
edad = 30
print("Dentro de la función:", edad)
cambiar_edad()
print("Fuera de la función:", edad)
Salida:
Dentro de la función: 30 Fuera de la función: 25
Si de verdad necesitas que una función modifique una variable global, existe la palabra clave global: escribiendo global edad como primera línea de la función, la asignación edad = 30 pasa a modificar la variable de afuera en vez de crear una local. Es poco frecuente usarla al empezar a programar (suele ser señal de que conviene usar return en su lugar), pero vas a encontrarla leyendo código de otros.
¿Qué imprime este programa?
saldo = 500
def actualizar_saldo():
saldo = 1000
print("Dentro:", saldo)
actualizar_saldo()
print("Fuera:", saldo)
Errores comunes
❌ Confundir parámetro con argumento
El parámetro es el nombre en la definición (def f(x):); el argumento es el valor real que le pasas al llamar (f(5)).
❌ Olvidar el return
Sin return explícito, la función devuelve None. Guardar ese resultado en una variable esperando otra cosa es un error frecuente, sobre todo confundiendo return con print().
❌ Parámetro obligatorio después de uno con valor por defecto
def f(a=1, b): es SyntaxError. Los parámetros con valor por defecto siempre van al final de la lista.
❌ Esperar que una asignación modifique la variable global
Asignarle un valor a un nombre dentro de una función crea una variable local nueva, aunque exista una global con el mismo nombre —no la modifica, salvo que uses global explícitamente.
Ejercicios Propuestos
Pon en práctica lo aprendido resolviendo los siguientes ejercicios directamente en el bloque editable.
- Escribe una función
es_mayor_de_edad(edad)que devuelvaTruesiedades mayor o igual a 18, yFalseen caso contrario. - Escribe una función
saludo(nombre, mensaje="Hola")con un valor por defecto, y pruébala llamándola una vez sin el segundo argumento y otra vez pasándoselo. - Escribe una función
promedio(a, b, c)que devuelva el promedio de los tres números. - Escribe una función
dividir(a, b)que devuelva tanto el cociente como el resto (retorno múltiple), y desempaqueta el resultado en dos variables al llamarla. - Escribe una función
contador_local()con una variable local que valga0al empezar y se convierta en1antes de terminar. Llámala dos veces seguidas e imprime el resultado cada vez, para comprobar que no conserva el valor entre llamadas.
Reto Final
Escribe una función calcular_total(precio, cantidad, descuento=0) para una caja registradora:
- Multiplica
precioporcantidad. descuentoes un porcentaje (0 a 100) y es opcional, con0como valor por defecto.- Si hay descuento, réstalo del total antes de devolverlo.
- La función debe devolver el total final con
return, redondeado a 2 decimales conround().
Pruébala con estas dos llamadas:
print(calcular_total(50, 3))
print(calcular_total(50, 3, 20))
150.0 120.0
Cheat Sheet
| Uso | Ejemplo |
|---|---|
| Definir una función | def nombre(parámetros): ... |
| Llamar una función | nombre(argumentos) |
| Parámetro con valor por defecto | def nombre(param=valor): ... |
| Devolver un valor | return valor |
| Devolver sin valor (None) | return o sin return |
| Devolver varios valores | return valor1, valor2 |
| Desempaquetar retorno múltiple | a, b = funcion() |
| Variable local | Existe solo dentro de la función donde se creó |
| Leer una variable global | Funciona sin nada especial |
| Modificar una variable global | global nombre (dentro de la función) |
¿Sabías que...?
📝 Docstrings
Justo debajo de def, entre triples comillas ("""así"""), puedes escribir una descripción de lo que hace la función. Se llama docstring y muchos editores la muestran automáticamente al usar la función.
🧩 Las funciones son valores
En Python, una función se puede guardar en una variable o pasar como argumento a otra función, igual que un número o un texto. Es la base de patrones más avanzados que vas a ver más adelante en el curso.
📦 *args y **kwargs
Cuando no sabes de antemano cuántos argumentos va a recibir una función, Python permite parámetros "variables" con *args y **kwargs. Todavía no los necesitas, pero los vas a encontrar leyendo código ajeno.