La solicitud

De Jennifer Castillo, Líder del Equipo de Soporte
Tu objetivo
Define order_summary(prices) que devuelva un dict con las claves 'items' (cantidad de precios, int), 'total' (suma, redondeada a 2) y 'average' (total dividido entre la cantidad, redondeado a 2; usa 0.0 cuando la lista esté vacía). Asigna a result el valor de order_summary([49.99, 34.00, 34.00, 12.50]).
- 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 Jennifer, y por qué
La lección
Una función, varias respuestas
Una función devuelve un objeto, pero ese objeto puede contener varios valores. Dos opciones habituales son una tupla y un diccionario.
Una tupla es rápida:
def min_max(prices):
return min(prices), max(prices)
low, high = min_max([49.99, 34.00, 12.50]) # unpack into two variables
Un diccionario es más claro cuando hay más de dos valores, porque cada valor tiene un nombre:
summary = order_summary([49.99, 34.00, 34.00, 12.50])
summary["total"] # 130.49
summary["average"] # 32.62
Nadie tiene que acordarse de que el total es «lo segundo». En el código de análisis que se comparte, ganan los resultados con nombre.
Construir el resumen
Calcula las piezas en variables con buen nombre y ensambla el diccionario al final:
def order_summary(prices):
count = len(prices)
total = sum(prices)
average = total / count if count else 0.0
return {"items": count, "total": round(total, 2), "average": round(average, 2)}
El redondeo se hace solo en los valores devueltos. El promedio se calcula a partir del total sin redondear, así que no se cuela ningún error de redondeo.
La expresión condicional
total / count if count else 0.0 es un if en línea: valor-si-verdadero, if condición, else
valor-si-falso. Es ideal para pequeñas decisiones como esta. Una lista vacía tiene count == 0, y 0
cuenta como falso en una condición, así que la función devuelve 0.0 en lugar de caerse.
Eso funciona porque cada valor en Python es «verdadero» o «falso» según el contexto. Los valores falsos
son 0, 0.0, "", [], {}, None y False; casi todo lo demás es verdadero. if prices: es la
forma idiomática de preguntar «¿esta lista no está vacía?».
Los casos límite son parte del trabajo
Sin la protección, order_summary([]) lanza ZeroDivisionError: division by zero. ¿Llegará alguna vez
un carrito vacío a esta función? En datos de producción, la respuesta casi siempre es «sí, tarde o
temprano». Piensa en el caso vacío, el caso de un solo artículo y los valores raros (precios cero o
negativos) para cada función que escribas, y decide qué debe hacer.
Si «0.0» o «sin promedio» (None) es la respuesta correcta para un carrito vacío es una decisión de
diseño. Aquí el encargo dice 0.0, así que eso es lo que devuelve la función.
Probar una función
Llámala con casos en los que conozcas la respuesta:
order_summary([10, 20]) # {'items': 2, 'total': 30, 'average': 15.0}
order_summary([]) # {'items': 0, 'total': 0, 'average': 0.0}
Un par de llamadas comprobadas a mano detectan la mayoría de los errores, como dividir entre la cuenta equivocada o devolver el total bajo la clave equivocada.
Errores comunes
- Usar
round()en el total antes de calcular el promedio. - Escribir mal una clave, por ejemplo
"avg"en lugar de"average". El comprobador, y tus compañeros, buscan el nombre exacto. - Olvidar la protección de la lista vacía y dejar que
ZeroDivisionErrorllegue al usuario.
¡Linterna encendida!
Practicaste: returndictionariesedge caseslen sum
- Resuelto
- Sin pistas
- Al primer intento
