diff --git a/lab-python-error-handling.ipynb b/lab-python-error-handling.ipynb index 3e50ef8..c43b5a9 100644 --- a/lab-python-error-handling.ipynb +++ b/lab-python-error-handling.ipynb @@ -41,18 +41,318 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "id": "cc2c441d-9dcf-4817-b097-cf6cbe440846", "metadata": {}, "outputs": [], "source": [ - "# your code goes here" + "products = [\"t-shirt\",\"mug\",\"hat\",\"book\",\"keychain\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "781eb2be", + "metadata": {}, + "outputs": [], + "source": [ + "def initialize_inventory(products):\n", + " inventory = {}\n", + "\n", + " for key in products:\n", + " while True: # Esto garantiza que pedirá la entrada hasta que sea válida\n", + " try:\n", + " # Solicitar el stock del producto\n", + " stock = input(f\"{key} stock: \")\n", + "\n", + " # Intentar convertir el stock a un número entero\n", + " stock = int(stock)\n", + "\n", + " # Verificar que el stock no sea negativo\n", + " if stock < 0:\n", + " raise ValueError(\"El stock no puede ser negativo.\")\n", + "\n", + " # Si no hay error, guardamos el producto en el inventario\n", + " inventory[key] = stock\n", + " break # Salir del bucle y pasar al siguiente producto\n", + "\n", + " except ValueError as ve:\n", + " # Captura el error si no es un número o es negativo\n", + " print(f\"Error: {ve}. Por favor, ingresa un número válido para el stock de {key}.\")\n", + " except Exception as e:\n", + " # Captura cualquier otro tipo de error inesperado\n", + " print(f\"Ha ocurrido un error: {e}. Intenta nuevamente.\")\n", + " \n", + " return inventory\n" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "f2f1f68f", + "metadata": {}, + "outputs": [], + "source": [ + "def add_products(customers_orders, products):\n", + " while True: # Bucle para asegurarnos de que se ingresa un producto válido\n", + " try:\n", + " # Pedir al usuario que añada un producto\n", + " producto = input(\"Añade un producto a tu pedido: \")\n", + "\n", + " # Comprobar si el producto está en la lista de productos\n", + " if producto not in products:\n", + " raise ValueError(f\"El producto '{producto}' no está en la lista de productos disponibles. \"\n", + " f\"Por favor, elige uno de los siguientes: {', '.join(products)}.\")\n", + " \n", + " # Si el producto es válido, lo añadimos al pedido\n", + " customers_orders.add(producto)\n", + " print(f\"Producto '{producto}' añadido a tu pedido.\")\n", + " break # Salir del bucle si la entrada es válida\n", + " \n", + " except ValueError as e:\n", + " # Mostrar un mensaje si el producto no está en la lista\n", + " print(e)\n", + " except Exception as e:\n", + " # Capturar cualquier otro error inesperado\n", + " print(f\"Ha ocurrido un error inesperado: {e}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "be3639c8", + "metadata": {}, + "outputs": [], + "source": [ + "def ask_for_decision(customers_orders, products):\n", + " \"\"\"\n", + " Función auxiliar para pedir al usuario una respuesta 'si' o 'no' y añadir productos.\n", + " \"\"\"\n", + " decision = input('¿Quieres añadir un producto a tu pedido?: ').lower()\n", + "\n", + " while decision not in ('si', 'no'):\n", + " decision = input('Por favor, escriba \"si\" o \"no\": ').lower()\n", + " \n", + " while decision == 'si':\n", + " # Añadir producto\n", + " producto = input(\"Añade un producto a tu pedido: \")\n", + " \n", + " # Validar si el producto está en la lista de productos\n", + " while producto not in products:\n", + " producto = input(f\"Por favor, añade un producto de la siguiente lista: {', '.join(products)}: \")\n", + " \n", + " customers_orders.add(producto)\n", + "\n", + " # Preguntar nuevamente si desea añadir otro producto\n", + " decision = input('¿Quieres añadir otro producto?: ').lower()\n", + " \n", + " while decision not in ('si', 'no'):\n", + " decision = input('Por favor, escriba \"si\" o \"no\": ').lower()\n", + "\n", + "\n", + "def get_customer_orders(products):\n", + " \"\"\"\n", + " Función que permite al usuario añadir productos a su pedido, con control de flujo\n", + " y manejo de errores.\n", + " \"\"\"\n", + " customers_orders = set()\n", + "\n", + " # Llamamos a la función ask_for_decision para comenzar el proceso\n", + " ask_for_decision(customers_orders, products)\n", + "\n", + " return customers_orders" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "c747e245", + "metadata": {}, + "outputs": [], + "source": [ + "def update_inventory(customers_orders, inventory):\n", + " \"\"\"\n", + " Actualiza el inventario según los productos en el pedido de los clientes.\n", + " Si el producto no está en el inventario o hay otros errores, se manejan adecuadamente.\n", + " \"\"\"\n", + " for producto in customers_orders:\n", + " try:\n", + " # Verificar si el producto existe en el inventario\n", + " if producto not in inventory:\n", + " raise KeyError(f\"El producto '{producto}' no está en el inventario.\")\n", + "\n", + " # Obtener la cantidad actual del producto en el inventario\n", + " num_product = inventory[producto]\n", + " \n", + " # Verificar que la cantidad de productos en el inventario sea un número entero\n", + " if not isinstance(num_product, int):\n", + " raise TypeError(f\"La cantidad de '{producto}' debe ser un número entero.\")\n", + "\n", + " # Verificar que el inventario no sea negativo antes de restar\n", + " if num_product <= 0:\n", + " raise ValueError(f\"No hay suficiente stock de '{producto}' para procesar el pedido.\")\n", + " \n", + " # Actualizar el inventario restando 1 al número de productos\n", + " new_num_products = num_product - 1\n", + " inventory[producto] = new_num_products\n", + "\n", + " print(f\"Se ha actualizado el inventario de '{producto}'. Stock restante: {new_num_products}\")\n", + " \n", + " except KeyError as e:\n", + " print(f\"Error: {e}\")\n", + " except TypeError as e:\n", + " print(f\"Error: {e}\")\n", + " except ValueError as e:\n", + " print(f\"Error: {e}\")\n", + " except Exception as e:\n", + " # Captura cualquier otro error inesperado\n", + " print(f\"Ha ocurrido un error inesperado al actualizar el inventario: {e}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "588daebe", + "metadata": {}, + "outputs": [], + "source": [ + "def calculate_order_statistics(customers_orders, products):\n", + " \"\"\"\n", + " Calcula el porcentaje de productos pedidos en comparación con el total de productos disponibles.\n", + " Maneja errores relacionados con divisiones por cero y tipos de datos incorrectos.\n", + " \"\"\"\n", + " try:\n", + " # Validación de tipos de datos\n", + " if not isinstance(customers_orders, (list, set)):\n", + " raise TypeError(\"El parámetro 'customers_orders' debe ser una lista o un conjunto.\")\n", + " \n", + " if not isinstance(products, (list, set)):\n", + " raise TypeError(\"El parámetro 'products' debe ser una lista o un conjunto.\")\n", + " \n", + " # Verificar si la lista de productos está vacía\n", + " total_products = len(products)\n", + " if total_products == 0:\n", + " raise ValueError(\"La lista de productos está vacía. No se puede calcular el porcentaje.\")\n", + "\n", + " # Calcular el total de productos pedidos\n", + " total_products_ordered = len(customers_orders)\n", + "\n", + " # Calcular el porcentaje de productos pedidos\n", + " percentage_ordered = (total_products_ordered / total_products) * 100\n", + "\n", + " return percentage_ordered, total_products_ordered\n", + "\n", + " except TypeError as e:\n", + " print(f\"Error de tipo: {e}\")\n", + " return None, None\n", + " except ValueError as e:\n", + " print(f\"Error de valor: {e}\")\n", + " return None, None\n", + " except Exception as e:\n", + " print(f\"Ha ocurrido un error inesperado: {e}\")\n", + " return None, None\n" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "bf429269", + "metadata": {}, + "outputs": [], + "source": [ + "def print_order_statistics(percentage_ordered, total_products_ordered):\n", + " \"\"\"\n", + " Imprime las estadísticas del pedido, como el porcentaje de productos ordenados \n", + " y el total de productos pedidos, con manejo de errores básicos.\n", + " \"\"\"\n", + " try:\n", + " # Verificar que los valores no sean None o negativos\n", + " if percentage_ordered is None or total_products_ordered is None:\n", + " raise ValueError(\"Los valores de 'percentage_ordered' y 'total_products_ordered' no pueden ser None.\")\n", + " \n", + " if percentage_ordered < 0 or total_products_ordered < 0:\n", + " raise ValueError(\"Los valores de 'percentage_ordered' y 'total_products_ordered' no pueden ser negativos.\")\n", + " \n", + " # Imprimir el porcentaje de productos ordenados con formato adecuado\n", + " print(f'El porcentaje de productos ordenados es: {percentage_ordered:.2f}%')\n", + "\n", + " # Imprimir las estadísticas del pedido\n", + " print(f'Order statistics \\nTotal products ordered: {total_products_ordered} \\nPercentage of products ordered: {percentage_ordered:.2f} %')\n", + "\n", + " except ValueError as e:\n", + " print(f\"Error: {e}\")\n", + " except Exception as e:\n", + " print(f\"Ha ocurrido un error inesperado: {e}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "ae4bf6c9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Se ha actualizado el inventario de 'mug'. Stock restante: 3\n", + "El porcentaje de productos ordenados es: 20.00%\n", + "Order statistics \n", + "Total products ordered: 1 \n", + "Percentage of products ordered: 20.00 %\n" + ] + } + ], + "source": [ + "def main():\n", + " # Lista de productos disponibles en el inventario\n", + " products = [\"t-shirt\", \"mug\", \"hat\", \"book\", \"keychain\"]\n", + "\n", + " # 1. Inicializar el inventario\n", + " try:\n", + " inventory = initialize_inventory(products)\n", + " except Exception as e:\n", + " print(f\"Error al inicializar el inventario: {e}\")\n", + " return # Salir del programa si hay un error en la inicialización del inventario\n", + "\n", + " # 2. Obtener los pedidos de los clientes\n", + " try:\n", + " customers_orders = get_customer_orders(products)\n", + " except Exception as e:\n", + " print(f\"Error al obtener los pedidos de los clientes: {e}\")\n", + " return # Salir si ocurre un error al obtener los pedidos\n", + "\n", + " # 3. Actualizar el inventario con los pedidos\n", + " try:\n", + " update_inventory(customers_orders, inventory)\n", + " except KeyError as e:\n", + " print(f\"Error al actualizar el inventario: Producto '{e}' no encontrado en el inventario.\")\n", + " return # Salir si un producto en el pedido no existe en el inventario\n", + "\n", + " # 4. Calcular las estadísticas del pedido\n", + " try:\n", + " percentage_ordered, total_products_ordered = calculate_order_statistics(customers_orders, products)\n", + " except Exception as e:\n", + " print(f\"Error al calcular las estadísticas del pedido: {e}\")\n", + " return # Salir si ocurre un error en el cálculo de estadísticas\n", + "\n", + " # 5. Imprimir las estadísticas del pedido\n", + " try:\n", + " print_order_statistics(percentage_ordered, total_products_ordered)\n", + " except Exception as e:\n", + " print(f\"Error al imprimir las estadísticas del pedido: {e}\")\n", + " return # Salir si hay un error al imprimir las estadísticas\n", + "\n", + "\n", + "# Llamar a la función principal\n", + "if __name__ == \"__main__\":\n", + " main()\n" ] } ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -66,7 +366,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.13" + "version": "3.9.6" } }, "nbformat": 4,