Skip to content

Lab Done #432

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
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
153 changes: 151 additions & 2 deletions lab-python-error-handling.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -72,11 +72,160 @@
"\n",
"4. Test your code by running the program and deliberately entering invalid quantities and product names. Make sure the error handling mechanism works as expected.\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "17ff5f9d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Creando Inventario Inicial\n",
"\n",
"Inventario inicial guardado:\n",
"{'t-shirt': 3, 'mug': 2, 'hat': 2, 'book': 5, 'keychain': 6}\n",
"\n",
"--- Gestionando Pedido del Cliente ---\n",
"Introduce los 3 productos uno por uno:\n",
"\n",
"Pedido del cliente recibido:\n",
"{'hat', 'book', 'mug'}\n",
"\n",
"--- Calculando Precio Total ---\n",
"\n",
"El precio total del pedido es: 60.0 €\n"
]
}
],
"source": [
"#LAB: Error Handling\n",
"\n",
"# Lista de productos que manejamos\n",
"lista_productos = [\"t-shirt\", \"mug\", \"hat\", \"book\", \"keychain\"]\n",
"\n",
"# Función para crear el inventario inicial, ahora con control de errores.\n",
"def crear_stock_inicial(productos):\n",
" \"\"\"\n",
" Pide al usuario la cantidad inicial para cada producto.\n",
" No permite que se introduzcan valores que no sean números o que sean negativos.\n",
" \"\"\"\n",
" stock = {}\n",
" print(\"Creando Inventario Inicial\")\n",
" for producto in productos:\n",
" # Hago un bucle infinito que solo se romperá cuando el usuario ponga un número válido.\n",
" while True:\n",
" try:\n",
" cantidad = int(input(f\"Introduce la cantidad de '{producto}': \"))\n",
" # Si el número es negativo, le aviso y el bucle vuelve a empezar.\n",
" if cantidad < 0:\n",
" print(\"¡Ojo! La cantidad no puede ser negativa. Inténtalo de nuevo.\")\n",
" # Si el número es correcto (0 o más), lo guardo y rompo el bucle.\n",
" else:\n",
" stock[producto] = cantidad\n",
" break\n",
" # Si el usuario escribe texto en vez de un número, saltará este error.\n",
" except ValueError:\n",
" print(\"¡Error! Debes introducir un número entero.\")\n",
" return stock\n",
"\n",
"# Función para que el cliente haga su pedido, también con control de errores.\n",
"def conseguir_pedido(stock_actual):\n",
" \"\"\"\n",
" Pide al usuario los productos que quiere.\n",
" Comprueba que el número de productos sea válido.\n",
" Comprueba que el producto exista y que haya stock.\n",
" \"\"\"\n",
" print(\"\\n--- Gestionando Pedido del Cliente ---\")\n",
" \n",
" # Primero, pido el número de productos diferentes que va a querer.\n",
" while True:\n",
" try:\n",
" num_pedidos = int(input(\"Introduce el número de productos distintos que quieres pedir: \"))\n",
" if num_pedidos > 0:\n",
" break # Si es un número positivo, salimos del bucle.\n",
" else:\n",
" print(\"El número de productos debe ser mayor que cero.\")\n",
" except ValueError:\n",
" print(\"Por favor, introduce un número válido.\")\n",
"\n",
" # Ahora pido los nombres de los productos.\n",
" pedido_cliente = set()\n",
" print(f\"Introduce los {num_pedidos} productos uno por uno:\")\n",
" while len(pedido_cliente) < num_pedidos:\n",
" # Bucle para pedir un producto válido\n",
" while True:\n",
" try:\n",
" nombre_producto = input(f\"Producto #{len(pedido_cliente) + 1}: \")\n",
" \n",
" # Compruebo si el producto existe en nuestro stock\n",
" if nombre_producto not in stock_actual:\n",
" # Si no existe, lanzo un error yo mismo para que lo capture el 'except'.\n",
" raise ValueError(f\"El producto '{nombre_producto}' no existe en la tienda.\")\n",
" \n",
" # Compruebo si queda stock de ese producto\n",
" if stock_actual[nombre_producto] == 0:\n",
" raise ValueError(f\"Lo siento, no queda stock de '{nombre_producto}'.\")\n",
"\n",
" # Si todo está bien, lo añado al set y rompo el bucle para pedir el siguiente producto\n",
" pedido_cliente.add(nombre_producto)\n",
" break\n",
" \n",
" except ValueError as e:\n",
" # Capturo el error (ya sea porque no existe o no hay stock) y muestro el mensaje.\n",
" print(f\"Error: {e} Por favor, elige otro producto.\")\n",
"\n",
" return pedido_cliente\n",
"\n",
"\n",
"# Función para calcular el precio total, con control de errores.\n",
"def calcular_precio_final(pedido):\n",
" \"\"\"\n",
" Para cada producto en el pedido, pide un precio.\n",
" No permite precios negativos o que no sean números.\n",
" \"\"\"\n",
" print(\"\\n--- Calculando Precio Total ---\")\n",
" precio_total = 0.0 # Uso 0.0 para que el resultado sea un float\n",
" \n",
" for producto in pedido:\n",
" # Otro bucle infinito para asegurarme de que el precio es válido.\n",
" while True:\n",
" try:\n",
" precio = float(input(f\"Introduce el precio de '{producto}': \"))\n",
" if precio > 0:\n",
" precio_total += precio # Sumo el precio al total.\n",
" break # Salgo del bucle si el precio es correcto.\n",
" else:\n",
" print(\"El precio debe ser un número positivo.\")\n",
" except ValueError:\n",
" print(\"¡Error! Debes introducir un número (ej: 10.50).\")\n",
" \n",
" return precio_total\n",
"\n",
"\n",
"# EJECUCIÓN DEL PROGRAMA\n",
"\n",
"# 1. Creamos el inventario con la función que controla errores.\n",
"inventario = crear_stock_inicial(lista_productos)\n",
"print(\"\\nInventario inicial guardado:\")\n",
"print(inventario)\n",
"\n",
"# 2. Obtenemos el pedido del cliente con la función que controla errores.\n",
"orden_del_cliente = conseguir_pedido(inventario)\n",
"print(\"\\nPedido del cliente recibido:\")\n",
"print(orden_del_cliente)\n",
"\n",
"# 3. Calculamos el precio total con la función que controla errores.\n",
"total_a_pagar = calcular_precio_final(orden_del_cliente)\n",
"print(f\"\\nEl precio total del pedido es: {total_a_pagar} €\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"display_name": "base",
"language": "python",
"name": "python3"
},
Expand All @@ -90,7 +239,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.13"
"version": "3.12.7"
}
},
"nbformat": 4,
Expand Down