🐍 Guía de Aula Invertida
vistas

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.

RC
Ing. Roy Carrasco
Facultad de Ingeniería de Sistemas · UAB

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.

Objetivo del módulo

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).

💻 Código en vivo

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.

0 / 0
preguntas y ejercicios enviados

📖 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.

Python
def saludar():
    print("¡Hola! Bienvenido al curso de POO.")

saludar()
saludar()
✍️ Tu turno: escribe el código y ejecútalo

Salida:

Consola
¡Hola! Bienvenido al curso de POO.
¡Hola! Bienvenido al curso de POO.
Definir vs. llamar

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.

Python
def saludar(nombre):
    print("Hola,", nombre)

saludar("Ana")
saludar("Luis")
✍️ Tu turno: escribe el código y ejecútalo

Salida:

Consola
Hola, Ana
Hola, Luis
Parámetro vs. argumento

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:

Python
def presentar(nombre, edad):
    print(nombre, "tiene", edad, "años")

presentar("Marta", 20)
✍️ Tu turno: escribe el código y ejecútalo
El orden importa

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".

Selección múltiple

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.

Python
def potencia(base, exponente=2):
    print(base, "elevado a", exponente, "es", base ** exponente)

potencia(5)
potencia(5, 3)
✍️ Tu turno: escribe el código y ejecútalo

Salida:

Consola
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.

Los valores por defecto van al final

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.

Python
def es_par(numero):
    return numero % 2 == 0

resultado = es_par(8)
print(resultado)
✍️ Tu turno: escribe el código y ejecútalo

return también corta la función en el momento en que se ejecuta, sin llegar a las líneas que vengan después:

Python
def clasificar(nota):
    if nota >= 51:
        return "Aprobado"
    return "Reprobado"

print(clasificar(70))
print(clasificar(30))
✍️ Tu turno: escribe el código y ejecútalo
Sin return, la función devuelve None

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:

Python
def imprimir_doble(x):
    print(x * 2)

resultado = imprimir_doble(5)
print(resultado)
✍️ Tu turno: escribe el código y ejecútalo

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:

Python
def dividir(a, b):
    cociente = a // b
    resto = a % b
    return cociente, resto

c, r = dividir(17, 5)
print("Cociente:", c, "Resto:", r)
✍️ Tu turno: escribe el código y ejecútalo

Á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.

Python
def cuadrado(numero):
    resultado = numero ** 2
    return resultado

print(cuadrado(4))
print(resultado)
✍️ Tu turno: escribe el código y ejecútalo

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:

Python
mensaje = "Hola desde afuera"

def mostrar():
    print(mensaje)

mostrar()
✍️ Tu turno: escribe el código y ejecútalo

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.

Python
edad = 25

def cambiar_edad():
    edad = 30
    print("Dentro de la función:", edad)

cambiar_edad()
print("Fuera de la función:", edad)
✍️ Tu turno: escribe el código y ejecútalo

Salida:

Consola
Dentro de la función: 30
Fuera de la función: 25
global (para más adelante)

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.

Selección múltiple

¿Qué imprime este programa?

Python
saldo = 500

def actualizar_saldo():
    saldo = 1000
    print("Dentro:", saldo)

actualizar_saldo()
print("Fuera:", saldo)
✍️ Tu turno: escribe el código y ejecútalo

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.

  1. Escribe una función es_mayor_de_edad(edad) que devuelva True si edad es mayor o igual a 18, y False en caso contrario.
  2. 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.
  3. Escribe una función promedio(a, b, c) que devuelva el promedio de los tres números.
  4. 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.
  5. Escribe una función contador_local() con una variable local que valga 0 al empezar y se convierta en 1 antes de terminar. Llámala dos veces seguidas e imprime el resultado cada vez, para comprobar que no conserva el valor entre llamadas.
✍️ Resuelve aquí los ejercicios

Reto Final

Escribe una función calcular_total(precio, cantidad, descuento=0) para una caja registradora:

  • Multiplica precio por cantidad.
  • descuento es un porcentaje (0 a 100) y es opcional, con 0 como 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 con round().

Pruébala con estas dos llamadas:

Python
print(calcular_total(50, 3))
print(calcular_total(50, 3, 20))
✍️ Tu turno: escribe el código y ejecútalo
Salida esperada
150.0
120.0

Cheat Sheet

UsoEjemplo
Definir una funcióndef nombre(parámetros): ...
Llamar una funciónnombre(argumentos)
Parámetro con valor por defectodef nombre(param=valor): ...
Devolver un valorreturn valor
Devolver sin valor (None)return o sin return
Devolver varios valoresreturn valor1, valor2
Desempaquetar retorno múltiplea, b = funcion()
Variable localExiste solo dentro de la función donde se creó
Leer una variable globalFunciona sin nada especial
Modificar una variable globalglobal 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.