Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Ejercicios: Procedimientos Estándar

Estandariza las operaciones de tu almacén creando funciones reutilizables.


Ejercicio 9.1: El Saludo Corporativo

  1. Define una función bienvenida(nombre: str).
  2. Debe imprimir: “Hola [nombre], empleado #1234”.
  3. Llama a la función dos veces con nombres diferentes.

Pista 1: necesitas combinar texto fijo con el valor de una variable dentro del mensaje; hay una forma de hacerlo sin ir concatenando pedazos con +.

Pista 2: arma el mensaje con un f-string: f"Hola {nombre}, empleado #1234".

¡Ojo!: nombrar una variable dentro de una función igual que una variable externa la esconde (la “shadowea”) dentro de esa función; asignarle un valor ahí crea una variable local nueva y no toca la de afuera, lo que sorprende a quien esperaba modificarla. Si de verdad necesitas tocar la externa, evita el shadowing: usa un nombre distinto o pásala como argumento y retórnala.

Ejercicio 9.2: La Calculadora de Áreas (return)

Necesitamos calcular el área de las cajas para saber cuánto cartón usar.

  1. Define una función area_caja(base: float, altura: float) -> float.
  2. Debe retornar (no imprimir) el resultado de base * altura.
  3. Prueba tu función:
    resultado = area_caja(10, 5)
    print(f"El área es: {resultado}")
    

Pista 1: si tu función imprime el resultado en vez de devolverlo, resultado terminará valiendo None.

Pista 2: la última línea del cuerpo debe retornar el área (base por altura), no imprimirla; una función que hace print en vez de return no deja reutilizar el resultado.

Ejercicio 9.3: Conversor de Moneda (Parámetros por defecto)

Un parámetro por defecto le da a la función un valor de respaldo cuando quien llama no pasa ese argumento: def funcion(a, b=10):. Útil cuando hay un caso común que no vale la pena repetir en cada llamada.

  1. Crea una función convertir_dolares(cantidad: float, tasa: float = 20.0) -> float.
  2. Si llamas a convertir_dolares(10), debe usar la tasa de 20.
  3. Si llamas a convertir_dolares(10, 18.5), debe usar 18.5.

Pista 1: el valor por defecto se escribe en la firma de la función, no dentro del cuerpo.

Pista 2: retorna el producto de la cantidad por la tasa; funciona igual sin importar si tasa llegó explícita o por defecto. No necesitas un if para distinguir los dos casos.

¡Ojo!: usar una lista (o cualquier objeto mutable) como valor por defecto en una función. Python crea ese valor una sola vez, al definir la función, así que todas las llamadas que no pasan el argumento comparten el mismo objeto, y los cambios se acumulan entre llamadas distintas. La solución: usa None como valor por defecto y crea el objeto mutable dentro del cuerpo: def agregar(item, lista=None): lista = [] if lista is None else lista.

Ejercicio 9.4: Validador de Acceso (Lógica dentro de Funciones)

Crea una función es_mayor_edad(edad: int) -> bool.

  1. Si edad es >= 18, retorna True.
  2. Si no, retorna False.
  3. Usa esa función en un if:
    if es_mayor_edad(15):
        print("Adelante")
    else:
        print("Fuera")
    

Pista 1: piensa qué produce ya de por sí una comparación como edad >= 18. No necesitas un if para decidir qué True/False retornar.

Pista 2: una comparación ya produce True/False, así que puedes retornarla directamente sin un if; la versión con if/else y dos return también vale, pero es más larga.

Ejercicio 9.5: El Formateador de Inventario

Parte de este diccionario (Cap. 5) con los datos del producto:

producto = {"nombre": "Laptop", "precio": 1500.00, "stock": 5}

Crea una función formato_producto(nombre: str, precio: float, stock: int) -> str y llámala pasando los valores del diccionario (producto["nombre"], etc.) como argumentos. Debe retornar una cadena con este formato exacto: “[PRODUCTO]: Laptop | $1500.00 | Disponibles: 5”

  • Usa f-strings.
  • Retorna, no imprimas.
  • Reto: reproduce el formato exacto (mayúsculas, espacios y separadores |) armándolo con un solo f-string, sin concatenaciones sueltas.

Pista 1: \[PRODUCTO\] es texto literal, no una variable: va tal cual dentro del f-string.

Pista 2: para forzar dos decimales en el precio usa el formato {precio:.2f} dentro del f-string; todo cabe en un solo return con una f-string que arme la ficha con los tres campos (nombre, precio con dos decimales y stock).

Ejercicio 9.6: El Descuento con Default

Escribe una función aplicar_descuento(precio, porcentaje=10):

  1. Si precio es negativo, devuelve None: ese pedido no procede. (En el Capítulo 10 conocerás una forma más ruidosa y más correcta de rechazarlo.)
  2. Si no, devuelve el precio con el descuento aplicado.
  3. Pruébala con aplicar_descuento(100) (usa el 10% por defecto), aplicar_descuento(100, 25) y aplicar_descuento(-5).

Pista 1: ¿qué debería pasar si el precio no es válido, antes de calcular nada? Piensa en salir de la función de inmediato en ese caso, sin llegar al cálculo del descuento.

Pista 2: calcula el monto del descuento como un porcentaje del precio (precio por porcentaje, entre 100) y réstalo del precio original.

Ejercicio 9.7: La Orden Explícita (Argumentos por Nombre)

Escribe una función etiquetar(nombre: str, pasillo: str = "A", refrigerado: bool = False) -> str que retorne la etiqueta: "Tornillos | Pasillo A | Ambiente" (o "Refrigerado" si aplica).

  1. Llámala solo con el nombre (todo por defecto).
  2. Llámala saltándote el pasillo pero activando la refrigeración.
  3. Llama con los tres argumentos nombrados en desorden y comprueba que da igual.

Pista 1: recuerda que puedes saltarte un argumento con valor por defecto nombrando directamente el siguiente; por posición no podrías llegar a refrigerado sin pasar pasillo primero.

Pista 2: para el tercer llamado, el orden de los argumentos nombrados no afecta el resultado: Python los empareja por nombre, no por posición.


¡Ojo!: Si una función no tiene return, Python secretamente le agrega return None al final.


Soluciones: en el Apéndice B está la solución de cada ejercicio. Inténtalo por tu cuenta antes de consultarla.


Tus funciones ya son confiables cuando reciben datos válidos. El siguiente capítulo cubre lo que pasa cuando no lo son: el protocolo de control de daños para que un dato corrupto no tumbe todo el almacén.