Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
308 changes: 304 additions & 4 deletions lab-python-error-handling.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -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"
},
Expand All @@ -66,7 +366,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.13"
"version": "3.9.6"
}
},
"nbformat": 4,
Expand Down