Nivel 1 · Una función de total de línea con descuento
¿Es nuevo para ti? Lee primero el concepto: Qué pasa cuando llamas a una función
0 de 3
La solicitud

De Angela Rivera, Directora de Atención al Cliente
Tu objetivo
Define line_total(quantity, unit_price, discount_pct=0.0) que devuelva quantity por unit_price por (1 menos discount_pct), redondeado a 2 decimales. discount_pct es una fracción (0.15 significa 15% de descuento). Asigna a result la lista [line_total(2, 49.99), line_total(3, 24.00, 0.15), line_total(1, 129.00, discount_pct=0.2)].
- Guarda una lista de 3 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 Angela, y por qué
La lección
Ponerle nombre a un trozo de lógica
Una función se define con def, un nombre, parámetros entre paréntesis y dos puntos. El cuerpo con
sangría hace el trabajo, y return devuelve un valor a quien la llamó:
def line_total(quantity, unit_price):
return quantity * unit_price
line_total(2, 49.99) # 99.98
Definir una función no la ejecuta. Python solo recuerda la receta. Se ejecuta cuando la llamas con paréntesis y valores reales, llamados argumentos. Dentro de la función, los parámetros se comportan como variables normales que solo existen durante esa llamada.
return frente a print
print muestra un valor en pantalla; return lo devuelve para que puedas guardarlo o usarlo en más
cálculos:
total = line_total(2, 49.99) + 7.50 # works because line_total returns a number
Una función sin return (o con un simple pass) devuelve None. Es el error de función más común de
los principiantes: la función muestra el número correcto, pero cada valor construido a partir de ella es
None, y la línea siguiente falla con TypeError: unsupported operand type(s) for +: 'NoneType' and 'float'.
return también termina la función de inmediato. Nada de lo que venga después en el cuerpo se ejecuta.
Argumentos por defecto
La mayoría de las líneas del carrito no llevan descuento, así que sería tedioso pasar 0 cada vez.
Dale al parámetro un valor por defecto con = en la definición:
def line_total(quantity, unit_price, discount_pct=0.0):
return round(quantity * unit_price * (1 - discount_pct), 2)
line_total(2, 49.99) # 99.98 discount_pct is 0.0
line_total(3, 24.00, 0.15) # 61.2 15% off
Los parámetros con valor por defecto deben ir después de los que no lo tienen, así que def f(a=1, b) es
un error de sintaxis.
Argumentos por nombre
Puedes pasar cualquier argumento por su nombre en lugar de por posición:
line_total(1, 129.00, discount_pct=0.2)
line_total(unit_price=129.00, quantity=1, discount_pct=0.2)
Los argumentos con nombre hacen que las llamadas se expliquen solas. Compara line_total(1, 129, 0.2)
con la versión de arriba: dentro de tres meses, la segunda sigue diciéndote qué significa 0.2. pandas
depende mucho de esto; llamadas como df.sort_values("unit_price", ascending=False) están en todas
partes.
Porcentajes: ¿fracción o número?
Decide una convención y dila en la función. Aquí discount_pct=0.15 significa 15%. Si alguien pasa 15
por error, el precio «con descuento» se vuelve negativo. Los conjuntos de datos reales mezclan ambas
convenciones, así que comprueba siempre unos cuantos valores antes de usar una columna de descuento.
Docstrings
Un string corto justo después de la línea def documenta la función, y las herramientas lo muestran como
ayuda:
def line_total(quantity, unit_price, discount_pct=0.0):
"""Return the line total after a fractional discount, rounded to cents."""
return round(quantity * unit_price * (1 - discount_pct), 2)
Errores comunes
- Dejar el
passo olvidarreturn, de modo que cada llamada daNone. - Escribir
discount_pctcomo porcentaje (15) en lugar de como fracción (0.15). - Llamar a la función antes de definirla. Python lee de arriba abajo, así que el
defdebe ejecutarse primero.
¡Linterna encendida!
Practicaste: defreturnparametersdefault argumentskeyword arguments
- Resuelto
- Sin pistas
- Al primer intento
