Módulo 2 · 03 | Funciones y reutilización de código

Módulo 2 · Video 03

Funciones desde cero: definir con def, llamar, recibir datos con parámetros, devolver con return (y no confundirlo con print), argumentos nombrados, valores por defecto, variables locales y docstrings. 10 pasos con práctica guiada y un mini proyecto de análisis reutilizable.

Cómo estudiar esta clase

Elegí un kernel de Python 3 (Jupyter o VS Code). Antes de ejecutar cada ejemplo, predecí el resultado; después ejecutá con Shift + Enter y comparalo con la salida esperada. No se necesitan librerías, internet ni archivos externos. Practicá en el notebook 05_Funciones_Desde_Cero.

Materiales de la clase

Notebook 05_Funciones_Desde_Cero: 10 pasos, 10 prácticas, mini proyecto y comprobaciones con assert. Requisitos: variables, listas, condicionales y bucles.

⬇ Descargar notebooks

1. Definir y llamar

Una función reúne instrucciones bajo un nombre. def define la función; su cuerpo no se ejecuta hasta llamarla con paréntesis. Los dos puntos y la sangría delimitan el cuerpo.

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

saludar()
saludar()

Salida esperada:

Hola, Python
Hola, Python

Tu práctica 01

Definí mostrar_inicio para imprimir Comenzamos y llamala una vez.

Resultado esperado:

Comenzamos

Explicá con tus palabras: ¿Qué aparece si ejecutás únicamente la definición?

2. Parámetros y argumentos

Un parámetro es el nombre del dato en la definición. Un argumento es el valor enviado en una llamada: nombre es un parámetro y "Ana" es un argumento. Cada llamada puede recibir un dato distinto.

def saludar_a(nombre):
    print("Hola", nombre)

saludar_a("Ana")
saludar_a("Luis")

Salida esperada:

Hola Ana
Hola Luis

Tu práctica 02

Definí mostrar_curso(nombre) e imprimí Curso: Python al llamarla con "Python".

Resultado esperado:

Curso: Python

Explicá con tus palabras: ¿Qué error ocurre si olvidás enviar un argumento obligatorio?

3. Devolver con return

return entrega un valor al código que llamó a la función y termina esa llamada. Guardar el resultado permite reutilizarlo. El print se ocupa de mostrarlo en pantalla.

def doble(numero):
    return numero * 2

resultado = doble(4)
print(resultado)
print(resultado + 1)

Salida esperada:

8
9

Tu práctica 03

Definí cuadrado(numero), guardá el resultado de cuadrado(5) e imprimilo.

Resultado esperado:

25

Explicá con tus palabras: ¿Se ejecutan las instrucciones que están después de un return en la misma rama?

4. Distinguir print de return

Mostrar y devolver son acciones diferentes. Una función que termina sin return explícito devuelve None. Por eso no podemos usar el número mostrado por print como si fuera su resultado devuelto.

def mostrar_doble(numero):
    print(numero * 2)

def devolver_doble(numero):
    return numero * 2

a = mostrar_doble(3)
b = devolver_doble(3)
print("a:", a)
print("b:", b)

Salida esperada:

6
a: None
b: 6

Tu práctica 04

Definí sumar_uno(numero) usando return. Guardá sumar_uno(9) e imprimí ese resultado multiplicado por 2.

Resultado esperado:

20

Explicá con tus palabras: ¿Qué recibiría resultado si sumar_uno solamente imprimiera?

5. Varios parámetros y argumentos nombrados

Los argumentos por posición siguen el orden de los parámetros. Los argumentos nombrados indican qué valor corresponde a cada nombre. Aquí suponemos precio y cantidad no negativos.

def calcular_importe(precio, cantidad):
    return precio * cantidad

print(calcular_importe(15000, 3))
print(calcular_importe(cantidad=3, precio=15000))

Salida esperada:

45000
45000

Tu práctica 05

Definí restar(a, b) y llamala con argumentos nombrados para obtener 10 – 3.

Resultado esperado:

7

Explicá con tus palabras: ¿Por qué el orden importa al restar aunque no lo notes al multiplicar?

6. Valores por defecto

Un valor por defecto se usa cuando omitís ese argumento. En esta función la tasa es una fracción entre 0 y 1: 0.10 representa 10 %. Cambiar la tasa en una llamada no cambia el valor por defecto de las siguientes.

def aplicar_descuento(precio, tasa=0.10):
    return precio * (1 - tasa)

print(aplicar_descuento(100))
print(aplicar_descuento(100, tasa=0.20))
print(aplicar_descuento(100))

Salida esperada:

90.0
80.0
90.0

Tu práctica 06

Definí incrementar(numero, paso=1). Mostrá incrementar(5) e incrementar(5, paso=3).

Resultado esperado:

6
8

Explicá con tus palabras: ¿Cuándo conviene permitir que un valor se configure como argumento?

7. Variables locales

Una variable asignada dentro de la función es local. En este ejemplo no reemplaza la variable exterior del mismo nombre. Preferí recibir datos por parámetros y devolver resultados. Si recibís una lista y la modificás con append, sí modificás ese objeto compartido; local no significa que todo objeto sea una copia.

total = 100
def sumar(a, b):
    total = a + b
    return total

print(sumar(2, 3))
print(total)

Salida esperada:

5
100

Tu práctica 07

Creá resultado = 99 fuera de una función triple(numero). Adentro guardá el triple en una variable local resultado y devolvelo. Imprimí triple(4) y luego la variable exterior.

Resultado esperado:

12
99

Explicá con tus palabras: ¿Por qué pasar parámetros facilita probar una función?

8. Documentar y decidir qué devolver

El docstring explica el contrato de la función: qué recibe y qué devuelve. Documentar un requisito no lo valida automáticamente. Aquí las notas deben estar entre 0 y 100. Cada rama devuelve una etiqueta.

def clasificar_nota(nota):
    """Recibe una nota de 0 a 100 y devuelve su clasificación."""
    if nota >= 60:
        return "Aprobado"
    return "Reforzar"

print(clasificar_nota(59))
print(clasificar_nota(60))

Salida esperada:

Reforzar
Aprobado

Tu práctica 08

Definí es_par(numero) para enteros, agregá un docstring y devolvé numero % 2 == 0. El operador % obtiene el resto de una división. Probá 4 y 5.

Resultado esperado:

True
False

Explicá con tus palabras: ¿Por qué conviene probar 59 y 60 en la clasificación?

9. Combinar funciones y bucles

El acumulador se reinicia en cada llamada. El return está fuera del for para devolver el total después de recorrer todos los datos. Una lista vacía devuelve cero.

def sumar_valores(valores):
    total = 0
    for valor in valores:
        total += valor
    return total

print(sumar_valores([10, 20, 5]))
print(sumar_valores([]))

Salida esperada:

35
0

Tu práctica 09

Definí contar_positivos(valores) que cuente números mayores que cero. Probá [-1, 0, 3, 8] y [].

Resultado esperado:

2
0

Explicá con tus palabras: ¿Qué pasaría si return estuviera dentro del for?

10. Mini proyecto: una función de análisis reutilizable

La función recibe una lista de importes numéricos, omite negativos y devuelve un diccionario. Las claves permiten identificar cada resultado. La lista original no se modifica. None representa ausencia de promedio cuando no hay datos válidos.

def resumir_importes(importes):
    """Resume importes numéricos >= 0; sin válidos, promedio es None."""
    cantidad = 0
    total = 0
    for importe in importes:
        if importe < 0:
            continue
        cantidad += 1
        total += importe
    promedio = None
    if cantidad > 0:
        promedio = total / cantidad
    return {"cantidad": cantidad, "total": total, "promedio": promedio}

print(resumir_importes([100, -20, 0, 200, 50]))
print(resumir_importes([]))

Salida esperada:

{'cantidad': 4, 'total': 350, 'promedio': 87.5}
{'cantidad': 0, 'total': 0, 'promedio': None}

Tu práctica 10

Usá resumir_importes con [50, -10, 150, 0], [-5] y [0]. Explicá la diferencia entre el promedio de los dos últimos casos.

Resultado esperado:

{'cantidad': 3, 'total': 200, 'promedio': 66.66666666666667}
{'cantidad': 0, 'total': 0, 'promedio': None}
{'cantidad': 1, 'total': 0, 'promedio': 0.0}

Explicá con tus palabras: ¿Por qué la función devuelve datos y los print quedan afuera?

Errores frecuentes

Revisá esto antes de pedir ayuda

• Definiste pero no llamaste: el cuerpo de una función no se ejecuta hasta escribir nombre().
• NameError: llamaste a la función antes de ejecutar la celda con su definición.
• TypeError por argumentos: faltó enviar un argumento obligatorio o enviaste de más.
• Aparece None: la función muestra con print pero no devuelve con return.
• return dentro del for: la función termina después del primer dato.
• Faltan los dos puntos o la sangría: def nombre(parametros): y el cuerpo con cuatro espacios.

Estudiá con IA (sin que te resuelva la tarea)

Copiá uno de estos prompts en ChatGPT, Claude o Gemini. Completá lo que está entre corchetes. La IA te guía con pistas; vos escribís el código y lo verificás ejecutándolo.

Prompt 1 · Tutor con pistas

Actuá como mi tutor de Python. Estoy en el Módulo 2 del curso "Python para Data Science e IA" (Quantux AI), clase de FUNCIONES: def, parámetros y argumentos, return frente a print, valores por defecto, variables locales y docstrings. Ya sé variables, listas, condicionales y bucles.

Reglas para ayudarme:
1. No me des la solución completa. Dame UNA pista por vez y esperá mi respuesta.
2. Antes de explicarme algo, pedime que prediga qué devuelve la función y qué se muestra en pantalla.
3. Usá ejemplos cortos, sin librerías, lambda ni *args.
4. Si mi función devuelve None o un valor inesperado, ayudame a revisar dónde está el return.
5. Cuando lo resuelva, pedime 2 llamadas de prueba (incluida una lista vacía o un caso límite).

Práctica: [pegá el enunciado]
Mi código: [pegá tu código]
Mi predicción y la salida real: [escribí ambas]

Prompt 2 · Repaso tipo quiz

Haceme un repaso de FUNCIONES en Python (def, parámetros, argumentos nombrados, valores por defecto, return, print y variables locales) para alguien que recién empieza.
- 6 preguntas, de a una: esperá mi respuesta antes de pasar a la siguiente.
- Mezclá: predecir qué devuelve una función, encontrar por qué da None y completar una función corta.
- Después de cada respuesta decime si está bien y por qué, en 2 o 3 líneas.
- Al final, dame un puntaje y los 2 temas que debería repasar.

Usala bien

• No pegues el enunciado pidiendo «resolvelo»: perdés la práctica.
• Toda respuesta de la IA se comprueba ejecutando el código en tu notebook.
• Si la IA usa algo que todavía no vimos (librerías, comprehensions, lambda), pedile que lo haga con lo visto en clase.

Practicá y comprobate

Resolvé las 10 prácticas y el mini proyecto del notebook 05_Funciones_Desde_Cero. Después respondé sin copiar código:

  1. ¿Qué diferencia hay entre un parámetro y un argumento?
  2. ¿Qué diferencia hay entre print y return? ¿Qué devuelve una función sin return?
  3. ¿Qué pasaría si el return de sumar_valores estuviera dentro del for?
  4. ¿Por qué una variable local no cambia la variable exterior del mismo nombre?
  5. ¿Por qué resumir_importes([-5]) y resumir_importes([0]) tienen promedios distintos?

Estás listo para avanzar si…

escribís una función con parámetros que devuelve un valor reutilizable, explicás print frente a return y tu resumir_importes pasa todas las comprobaciones del notebook. Si te cuesta, volvé a los pasos 3, 4 y 9.

Recursos

Scroll al inicio
¿Consultas? Escribinos