La solicitud

De Thomas Whitaker, Director de Merchandising
Tu objetivo
Define pct_change(old, new) que devuelva (new - old) / old * 100 redondeado a 1 decimal, o None cuando old sea 0. Asigna a result un diccionario que asocie cada nombre de producto de weekly_units con pct_change(last_week, this_week), en el mismo orden.
- Guarda un dict en
resultpendiente
Tu código
Cargando el editor…
Solución de referencia
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Thomas, y por qué
La lección
El cambio porcentual, la fórmula
El cambio porcentual compara un valor nuevo con uno anterior, en relación con el anterior:
(46 - 40) / 40 * 100 # 15.0 Dutch oven: up 15%
(102 - 120) / 120 * 100 # -15.0 pillow: down 15%
(41 - 32) / 32 * 100 # 28.125 vase: up 28.1% after rounding
El valor anterior es siempre el denominador. Eso es lo que hace que «sube un 15%» signifique «un 15% más que la semana pasada». Si divides entre el valor nuevo obtienes otro número, erróneo: el cojín mostraría -17.6%.
Una cláusula de guarda para el caso cero
Las luces decorativas no vendieron nada la semana pasada. (9 - 0) / 0 lanza ZeroDivisionError, e
incluso si no lo hiciera, no hay un crecimiento porcentual con sentido a partir de cero. La respuesta
honesta es «no definido», que en Python es None.
def pct_change(old, new):
if old == 0:
return None
return round((new - old) / old * 100, 1)
El primer if es una cláusula de guarda: maneja el caso especial y sale pronto de la función con
return. El cálculo principal que viene después nunca tiene que preocuparse por un cero. Escribir
primero el caso especial mantiene las funciones planas y legibles, sin un else envolviendo la lógica
principal.
Devolver None en lugar de 0 importa. Cero por ciento significa «igual que la semana pasada», que es lo
que hizo la lámpara de escritorio (15 unidades ambas semanas). Las luces decorativas hicieron algo muy
distinto, y el informe debería mostrarlo como un hueco, no como «sin cambio».
Aplicar la función a cada fila
Con la función escrita una sola vez, el bucle solo desempaqueta cada tupla y guarda la respuesta:
result = {}
for name, last_week, this_week in weekly_units:
result[name] = pct_change(last_week, this_week)
Los diccionarios conservan el orden en que se añadieron las claves, así que el resultado lista los productos en el mismo orden que la entrada. Como la lógica vive en una sola función, el informe de la semana que viene (o una versión interanual) la reutiliza sin cambios, y una corrección del caso cero solo tiene que hacerse una vez.
Errores comunes
- Dividir entre el valor nuevo en lugar del anterior.
- Devolver 0 o 100 para una base cero. Ambos parecen números reales en un informe y ambos son erróneos.
- Redondear antes de multiplicar por 100:
round((new - old) / old, 1) * 100convierte 28.125% en 30.0%. - Olvidar
return. Una función sin él devuelveNonepara cada producto.
¡Linterna encendida!
Practicaste: defreturnnonepercent changedictionaries
- Resuelto
- Sin pistas
- Al primer intento
