python

Python: ejercicio de artículos y ventas

En este post de programación en Python vamos a resolver un ejercicio que gestiona algo así como una tienda, en donde se registran artículos y se realizan ventas; todo esto usando listas o arreglos.

Esto que te muestro es un ejercicio básico de programación en Python, pero de igual modo es útil para los que están aprendiendo Python y quieren mejorar sus habilidades.

La propuesta dice:

Realizar un programa en Python para llevar la gestión de los precios de los artículos de una tienda, así como la cantidad vendida en total de cada artículo para lo cual, habrá que tener 3 vectores.

  1. Nombres: guardará los nombres de los artículos
  2. Precios: guardará los precios de los artículos
  3. Cantidades vendidas: guardará la cantidad vendida en total de cada artículo

Además, este programa debe implementar las siguientes opciones que van a mostrarse en un menú:

  1. Introducir un artículo nuevo – Registrar un nuevo artículo con nombre y precio
  2. Hacer una venta – Solicitar nombre de producto y cantidad a vender
  3. Mostrar información – Mostrar nombre, precio, cantidad vendida e importe de los artículos, además del total
  4. Borrar un artículo
  5. Borrar todos los artículos
  6. Salir

Obviamente cada para opción mencionada se debe programar el funcionamiento. Veamos entonces cómo se resuelve este ejercicio de programación.

Introducir nuevo artículo

Agregar producto a lista en Python

Para agregar un artículo simplemente solicitamos el nombre y precio para agregarlos a cada arreglo. En este caso vamos a agregar también un valor por defecto a las cantidades vendidas, que será 0 al inicio.

nombre = input("Nombre del producto: ")
precio = float(input("Precio del producto: "))
cantidad_vendida = 0.0
nombres.append(nombre)
precios.append(precio)
cantidades_vendidas.append(cantidad_vendida)

Fíjate en que para agregar un valor al arreglo o lista en Python usamos append.

Hacer una venta

Realizar una venta – Programa de gestión de productos en Python

Para el caso de hacer una venta debemos solicitar el nombre del producto que se vende. En caso de que no exista, debemos indicarlo; pero en caso contrario debemos solicitar la cantidad que se vende.

Podemos usar in para saber si una cadena está dentro de una lista en Python, y luego usar index para obtener el índice (la posición que ocupa) de ese elemento.

nombre_articulo = input("Nombre del artículo que se vende: ")
if nombre_articulo in nombres:
    cantidad = float(input("Cantidad vendida: "))
    indice = nombres.index(nombre_articulo)
    precio = precios[indice]
    cantidades_vendidas[indice] += cantidad
    print(
        f"Se vende(n) {cantidad} {nombre_articulo}. Total: {cantidad * precio}")
else:
    print("El artículo no existe")

Mostrar información

Mostrar información de productos – Tienda en Python

Pasemos al siguiente apartado, que es mostrar la información de todos los productos. Es decir, debemos mostrar el nombre, precio y la cantidad vendida.

Además, debemos mostrar el artículo más vendido, artículo menos vendido, artículo con más ingresos y artículo con menos ingresos. Para ello simplemente seguimos el algoritmo de encontrar el mayor y menor elemento en un arreglo.

if len(nombres) <= 0:
    print("No hay artículos")
    continue
# Los nombres de artículos
articulo_mas_vendido = nombres[0]
articulo_menos_vendido = nombres[0]
articulo_con_mas_ingresos = nombres[0]
articulo_con_menos_ingresos = nombres[0]
# Pero también necesitamos el conteo. Simplemente los inicializamos en un elemento del arreglo
mas_vendido = cantidades_vendidas[0]
menos_vendido = cantidades_vendidas[0]
con_mas_ingresos = cantidades_vendidas[0] * precios[0]
con_menos_ingresos = cantidades_vendidas[0] * precios[0]
print("+--------------------+----------+----------+----------+")
print("|NOMBRE              |CANT.     |PRECIO    |IMPORTE   |")
print("+--------------------+----------+----------+----------+")
indice = 0
total = 0
while indice < len(nombres):
    nombre = nombres[indice]
    precio = precios[indice]
    cantidad_vendida = cantidades_vendidas[indice]
    importe = precio * cantidad_vendida
    print("|{:<20}|{:>10.2f}|{:>10.2f}|{:>10.2f}|".format(
        nombre, cantidad_vendida, precio, importe))
    print("+--------------------+----------+----------+----------+")
    if cantidad_vendida > mas_vendido:
        mas_vendido = cantidad_vendida
        articulo_mas_vendido = nombre
    if cantidad_vendida < menos_vendido:
        menos_vendido = cantidad_vendida
        articulo_menos_vendido = nombre
    if importe > con_mas_ingresos:
        con_mas_ingresos = importe
        articulo_con_mas_ingresos = nombre
    if importe < con_menos_ingresos:
        con_menos_ingresos = importe
        articulo_con_menos_ingresos = nombre
    total += importe
    indice += 1

print(
    "|--------------------|----------|TOTAL:    |{:>10.2f}|".format(total))
print("+--------------------+----------+----------+----------+")
print(
    f"Artículo más vendido: {articulo_mas_vendido}, con {mas_vendido} unidades")
print(
    f"Artículo menos vendido: {articulo_menos_vendido}, con {menos_vendido} unidades")
print(
    f"Artículo con más ingresos: {articulo_con_mas_ingresos}, con {con_mas_ingresos} euros")
print(
    f"Artículo con menos ingresos: {articulo_con_menos_ingresos}, con {con_menos_ingresos} euros")

También vamos a mostrar la información e imprimirla; yo lo haré en un formato de tabla usando print para alinear los valores.

Borrar un artículo

Para borrar un artículo debemos eliminar los datos de los 3 vectores, listas o arreglos. Para ello usamos del. Recuerda que al igual que al vender, necesitamos comprobar que el artículo realmente existe.

nombre_articulo = input("Nombre del artículo que se elimina: ")
if nombre_articulo in nombres:
    indice = nombres.index(nombre_articulo)
    del nombres[indice]
    del precios[indice]
    del cantidades_vendidas[indice]
    print(f"Se elimina {nombre_articulo}")
else:
    print("El artículo no existe")

Eliminar todos los artículos

En el caso de eliminar todos los artículos vamos a declarar los arreglos como vacíos. Antes de hacerlo debemos pedir confirmación al usuario.

if input("Seguro (s/n): ") == "s":
    nombres = []
    precios = []
    cantidades_vendidas = []

Salir

Finalmente veamos la última opción del menú. En este caso invocamos a sys.exit para detener todo el script, aunque si estuviéramos dentro de una función bastaría con un return.

if input("Seguro (s/n): ") == "s":
    sys.exit()

Poniendo todo junto

En el inicio del script debemos declarar los 3 arreglos que van a llevar el registro de la información. Después hacemos un ciclo infinito en donde mostramos el menú, realizamos la operación de acuerdo a lo solicitado y seguimos con el ciclo.

El programa termina cuando el usuario selecciona salir. El código completo queda así:

"""
  ____          _____               _ _           _       
 |  _ \        |  __ \             (_) |         | |      
 | |_) |_   _  | |__) |_ _ _ __ _____| |__  _   _| |_ ___ 
 |  _ <| | | | |  ___/ _` | '__|_  / | '_ \| | | | __/ _ \
 | |_) | |_| | | |  | (_| | |   / /| | |_) | |_| | ||  __/
 |____/ \__, | |_|   \__,_|_|  /___|_|_.__/ \__, |\__\___|
         __/ |                               __/ |        
        |___/                               |___/         
    
____________________________________
/ Si necesitas ayuda, contáctame en \
\ https://parzibyte.me               /
 ------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
Creado por Parzibyte (https://parzibyte.me).
------------------------------------------------------------------------------------------------
Si el código es útil para ti, puedes agradecerme siguiéndome: https://parzibyte.me/blog/sigueme/
Y compartiendo mi blog con tus amigos
También tengo canal de YouTube: https://www.youtube.com/channel/UCroP4BTWjfM0CkGB6AFUoBg?sub_confirmation=1
------------------------------------------------------------------------------------------------
"""

import sys
nombres = []
precios = []
cantidades_vendidas = []

while True:
    print("""
=========================
    By Parzibyte
    https://parzibyte.me
=========================

""")
    eleccion = input("""
1 - Introducir un artículo nuevo
2 - Hacer una venta
3 - Mostrar información
4 - Borrar un artículo
5 - Borrar todos los artículos
6 - Salir
Seleccione: """)
    if eleccion == "1":
        nombre = input("Nombre del producto: ")
        precio = float(input("Precio del producto: "))
        cantidad_vendida = 0.0
        nombres.append(nombre)
        precios.append(precio)
        cantidades_vendidas.append(cantidad_vendida)
    elif eleccion == "2":
        nombre_articulo = input("Nombre del artículo que se vende: ")
        if nombre_articulo in nombres:
            cantidad = float(input("Cantidad vendida: "))
            indice = nombres.index(nombre_articulo)
            precio = precios[indice]
            cantidades_vendidas[indice] += cantidad
            print(
                f"Se vende(n) {cantidad} {nombre_articulo}. Total: {cantidad * precio}")
        else:
            print("El artículo no existe")
    elif eleccion == "3":
        if len(nombres) <= 0:
            print("No hay artículos")
            continue
        # Los nombres de artículos
        articulo_mas_vendido = nombres[0]
        articulo_menos_vendido = nombres[0]
        articulo_con_mas_ingresos = nombres[0]
        articulo_con_menos_ingresos = nombres[0]
        # Pero también necesitamos el conteo. Simplemente los inicializamos en un elemento del arreglo
        mas_vendido = cantidades_vendidas[0]
        menos_vendido = cantidades_vendidas[0]
        con_mas_ingresos = cantidades_vendidas[0] * precios[0]
        con_menos_ingresos = cantidades_vendidas[0] * precios[0]
        print("+--------------------+----------+----------+----------+")
        print("|NOMBRE              |CANT.     |PRECIO    |IMPORTE   |")
        print("+--------------------+----------+----------+----------+")
        indice = 0
        total = 0
        while indice < len(nombres):
            nombre = nombres[indice]
            precio = precios[indice]
            cantidad_vendida = cantidades_vendidas[indice]
            importe = precio * cantidad_vendida
            print("|{:<20}|{:>10.2f}|{:>10.2f}|{:>10.2f}|".format(
                nombre, cantidad_vendida, precio, importe))
            print("+--------------------+----------+----------+----------+")
            if cantidad_vendida > mas_vendido:
                mas_vendido = cantidad_vendida
                articulo_mas_vendido = nombre
            if cantidad_vendida < menos_vendido:
                menos_vendido = cantidad_vendida
                articulo_menos_vendido = nombre
            if importe > con_mas_ingresos:
                con_mas_ingresos = importe
                articulo_con_mas_ingresos = nombre
            if importe < con_menos_ingresos:
                con_menos_ingresos = importe
                articulo_con_menos_ingresos = nombre
            total += importe
            indice += 1

        print(
            "|--------------------|----------|TOTAL:    |{:>10.2f}|".format(total))
        print("+--------------------+----------+----------+----------+")
        print(
            f"Artículo más vendido: {articulo_mas_vendido}, con {mas_vendido} unidades")
        print(
            f"Artículo menos vendido: {articulo_menos_vendido}, con {menos_vendido} unidades")
        print(
            f"Artículo con más ingresos: {articulo_con_mas_ingresos}, con {con_mas_ingresos} euros")
        print(
            f"Artículo con menos ingresos: {articulo_con_menos_ingresos}, con {con_menos_ingresos} euros")
    elif eleccion == "4":
        nombre_articulo = input("Nombre del artículo que se elimina: ")
        if nombre_articulo in nombres:
            indice = nombres.index(nombre_articulo)
            del nombres[indice]
            del precios[indice]
            del cantidades_vendidas[indice]
            print(f"Se elimina {nombre_articulo}")
        else:
            print("El artículo no existe")

    elif eleccion == "5":
        if input("Seguro (s/n): ") == "s":
            nombres = []
            precios = []
            cantidades_vendidas = []

    elif eleccion == "6":
        if input("Seguro (s/n): ") == "s":
            sys.exit()

También te invito a leer más sobre Python en mi blog.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

  • Muchas gracias a sido muy útil, estoy en el proceso de un ejercicio de riesgos reproductivos RRPC, y me salió muy bien

  • Gracias! me fue muy útil para entender la estructura de un problema que era muy similar a este con la diferencia de que en el otro tenia que agregar diccionarios para los productos

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.