1. Faro

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

La solicitud

De Angela Rivera, Directora de Atención al Cliente

“Soporte se pasa el día rehaciendo totales de línea a mano, y los descuentos lo empeoran. ¿Puedes escribir una función que puedan llamar para cualquier línea, con el descuento opcional?”

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

Python

Cargando el editor…

    ResultadoPresiona Ejecutar para ver el tuyo

    Mote revisa tu resultado

    Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.

    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 pass o olvidar return, de modo que cada llamada da None.
    • Escribir discount_pct como 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 def debe ejecutarse primero.

    Elige qué puede ejecutarse en este sitio. Puedes cambiarlo cuando quieras desde "Configurar cookies", al pie de cada página.