Ejercicios: Procedimientos Estándar
Estandariza las operaciones de tu almacén creando funciones reutilizables.
Ejercicio 9.1: El Saludo Corporativo
- Define una función
bienvenida(nombre: str). - Debe imprimir: “Hola [nombre], empleado #1234”.
- 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.
- Define una función
area_caja(base: float, altura: float) -> float. - Debe retornar (no imprimir) el resultado de
base * altura. - 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,
resultadoterminará valiendoNone.Pista 2: la última línea del cuerpo debe retornar el área (base por altura), no imprimirla; una función que hace
returnno 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.
- Crea una función
convertir_dolares(cantidad: float, tasa: float = 20.0) -> float. - Si llamas a
convertir_dolares(10), debe usar la tasa de 20. - 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
tasallegó explícita o por defecto. No necesitas unifpara 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
Nonecomo 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.
- Si edad es >= 18, retorna
True. - Si no, retorna
False. - 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 unifpara decidir quéTrue/Falseretornar.Pista 2: una comparación ya produce
True/False, así que puedes retornarla directamente sin unif; la versión conif/elsey dosreturntambié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 soloreturncon 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):
- Si
precioes negativo, devuelveNone: ese pedido no procede. (En el Capítulo 10 conocerás una forma más ruidosa y más correcta de rechazarlo.) - Si no, devuelve el precio con el descuento aplicado.
- Pruébala con
aplicar_descuento(100)(usa el 10% por defecto),aplicar_descuento(100, 25)yaplicar_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).
- Llámala solo con el nombre (todo por defecto).
- Llámala saltándote el pasillo pero activando la refrigeración.
- 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
refrigeradosin pasarpasilloprimero.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 agregareturn Noneal 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.