Daniel Barros Garces
Fernando Arriola Colunga
Javier Aguilar
Construir una máquina de café en Python desde la terminal es una forma divertida de practicar funciones, módulos, bucles y control de flujo en un mismo proyecto. Aquí aprendes a estructurar el archivo principal, separar la lógica en módulos y manejar la entrada del usuario con input y condicionales.
¿Cómo se estructura el archivo principal de una máquina de café en Python?
Todo proyecto en Python necesita un punto de partida claro, y por convención ese archivo se llama main.py. Ahí vive el flujo principal y desde ahí se invoca todo lo demás.
Dentro de main.py defines una función main() que no recibe argumentos y contiene un bucle while True. Sí, leíste bien: la condición siempre es verdadera. Y aquí viene lo interesante: el bucle no se vuelve infinito porque tú decides cuándo romperlo con un break en el momento adecuado.
¿Para qué sirve
while Trueen Python? Crea un bucle que se repite indefinidamente hasta que unbreaklo interrumpe. Es útil cuando no sabes cuántas veces se ejecutará el ciclo, como en un menú interactivo.
¿Cómo capturar la opción del usuario con input?
La función input pide al usuario que escriba algo en la terminal y devuelve siempre un string. Por eso, al comparar la opción elegida, debes hacerlo contra texto: "1", "2", "3", no contra números enteros.
Dentro del bucle se muestra el menú, se guarda la elección en una variable opcion y se evalúa con if, elif y else:
"1": pedir un café."2": ver el historial de pedidos."3": salir con un mensaje de despedida y break.Mientras no tengas implementada una funcionalidad, usa pass para que Python no marque error y puedas seguir avanzando.
¿Por qué usar if __name__ == "__main__" en proyectos con varios archivos?
Cuando trabajas con múltiples módulos, necesitas asegurarte de que el programa arranque siempre desde el archivo correcto. Python resuelve esto con una línea muy específica al final del archivo principal:
python if name == "main": main()
Esa condición compara el nombre interno del archivo en ejecución con la cadena "__main__". Solo se cumple cuando ejecutas directamente main.py, lo que garantiza que el flujo principal arranque únicamente desde donde tú lo planeaste y no por accidente al importar el archivo desde otro módulo.
¿Cómo separar el menú y los pedidos en módulos distintos?
La idea es que cada archivo tenga una responsabilidad clara. Esto hace el código más legible y fácil de mantener.
¿Cómo construir el módulo del menú?
Creas un archivo llamado menu.py con una función mostrar_menu() que imprime las opciones disponibles. Usa \n al inicio del print para dejar un salto de línea y mejorar la lectura en terminal.
El menú incluye:
Luego, desde main.py, importas la función con from menu import mostrar_menu y la invocas dentro del bucle antes de pedir la opción al usuario. Al ejecutar el programa, ya verás el saludo Bienvenido a la máquina de café junto con las tres opciones.
¿Qué hace
from menu import mostrar_menu? Importa solo la funciónmostrar_menudesde el archivomenu.py, sin traer todo el módulo. Así puedes llamarla directamente como si estuviera en el mismo archivo.
¿Cómo manejar el pedido del café con un diccionario?
La lógica del pedido vive en un archivo aparte llamado pedidos.py. Dentro defines la función pedir_cafe() que imprime los tipos de café disponibles y pide al usuario que elija uno con input.
Las opciones se guardan en un diccionario donde la clave es el número de opción y el valor es el nombre del café:
1: expreso.2: cappuccino.3: latte.4: americano.Usar un diccionario te permite acceder al café elegido directamente con cafes[opcion], sin escribir cuatro if distintos. Es más limpio y escalable: si quieres agregar más cafés, solo añades entradas al diccionario.
¿Qué viene después de capturar el pedido?
La siguiente etapa consiste en guardar cada pedido en un archivo para que después puedas leerlo desde la opción de historial. Esa parte conecta directamente con la lectura y escritura de archivos vista en la clase anterior y se desarrolla en la próxima sección del proyecto.
Mientras tanto, ya tienes el esqueleto funcionando: un menú que se muestra, un usuario que elige, y tres caminos posibles controlados por condicionales. ¿Qué cafés agregarías tú al diccionario? Cuéntame en los comentarios.
Daniel Barros Garces
Fernando Arriola Colunga
Javier Aguilar
Richard Linarez
Argenis Daniel Nieves Berroeta
Javier Aguilar
CLAUDIA TALIA CARDONA VALADEZ
Jose Luis Ortiz Montaño
Santiago Andrés Sanchez Altamiranda
Miguel Alvarez Garcia
Matias Bello
Diego Mauricio Zuluaga Rodríguez
Mauricio Antonio Trujillo Acosta
Fabian Agüero
Alexander Coronell
Henry Mauricio Fonseca M
Hector Fuentes
Sebastián Acuña Rodríguez
Ariel Ezequiel Biazzo Genua
Jose Antonio Cortes Sanchez
Jhon Freyman Ramírez Cortés
Jhon Freyman Ramírez Cortés
Carlos Salamanca
Carlos Salamanca
Sergio Daniel Flamenco
Yamid Horacio Rodríguez
William Serrano
Claudia Iliana Padilla Magaña
Esta interesante que usemos el if pero lo que vimos en clases anteriores no queda mucho mejor utilizar el Match que es un poco mas directo?
Siempre hay más de una forma de resolver un problema.
Yo he estado haciendo un par de proyectos con lo que se ha aprendido antes... Apoyandome con IA y foros de redit y en grupos de gente que tambien esta aprendiendo... Parece que es por un tema de compatibilidad con versiones anteriores que muchos optan por usar if/else antes de usar switches... y como dijo el otro companero... Al final hay muchas formas de obtener el resultado.
😭 La mezcla de todo el contenido de este curso + el ver como se usa para crear algo se siente tan emocionante!!!! Me encanta.
Es como ser artesanos y ver como todo va tomando forma. =)
Me impresiona como en este punto ya no se ven casi comenarios...
Hola, Javier.
En el comentario de arriba, compartes que te has apoyado de grupos de personas que también están aprendiendo Python. ¿Cómo doy con esos grupos?
Muchas gracias.
Seria de gran ayuda si pudieras compartir esos foros, muchas gracias
Hola
He estado intentando realizar el ejercicio pero cuando debo de importar el mostrar_menu no me ejecuta, es como si no lo importara pero no me sale error
Alguien sabe como solucionarlo?
Hola, asegurate de lo que esta en
if __name__ == "__main__": # esto sea igual a tu función
main()
Me paso lo mismo. No Module named ´menu´
En mi caso fue un error bobo. En el Explorer cometí el error de no colocar correctamente menu.py dentro de la carpeta trabajo-final-maquina-cafe.
Deberia estar todo lo que queremos importar dentro de la "raiz" del main o colocarle la direccion completa. C:\user\pepe\doc etc etc...
¿Cómo un bucle while True funciona?
Un bucle while True crea una ejecución continua que siempre se repite. Para evitar un bucle infinito, utilizamos la sentencia break en puntos específicos del código, permitiendo salir del bucle solo cuando una condición deseada se cumple, como al seleccionar la opción de 'salir' en tu máquina de café. Esto es útil para menús interactivos.
Parece que en este curso la idea del examen final es impedir la obtención del diploma o certificado
Qué emoción llegar a este punto :)
# main.py from menu import mostrar_menu from pedidos import pedir_cafe def main(): while True: # Mostrar el menu mostrar_menu() opcion = input("Selecciona una opción: ") match opcion: case "1": # Pedir café pedir_cafe() case "2": # ver el historial pass case "3": # salir print("\n Muchas gracias por haber tomado nuestros riquísimos cafes") break case _: print( "Opción inválida, por favor indique una de las opciones sugeridas" ) if __name__ == "__main__": main()
#pedidos.py cafes = {"1": "Espresso", "2": "Cappuccino", "3": "Latte", "4": "Americano"} def pedir_cafe(): while True: print("\nElige el café que prefieras: ") for k, v in cafes.items(): print(k + ". " + v) print("5. Salir") opcion = input("Opción: ") match opcion: case "1": pass case "2": pass case "3": pass case "4": pass case "5": return case _: print("Selecciona una opción válida")
#menu.py def mostrar_menu(): print("\nBienvenido a la máquina de café") print("1. Pedir un café") print("2. Ver el historial de pedidos") print("3. Salir")
Genérame un ejercicio para practicar
Aquí tienes este ejercicio para comprobar cómo armamos el flujo del menú.
con que fin creo el dicionario de cafe?
Piensa en ese diccionario como la memoria central de tu máquina. En lugar de tener variables sueltas para cada café, agrupas toda la información —ingredientes, precios, recetas— bajo una sola estructura lógica que puedes consultar al instante.
Si mañana quisieras añadir una nueva bebida al menú, ¿por qué crees que modificar ese diccionario es mucho más eficiente que escribir nuevos bloques de código para cada ingrediente?
Buena explicacion.
Muchas veces y al empezar ciertos proyectos, la unica forma de perseverar ciertos datos es justamente las listas, los diccionarios, etc.
Lo que si pudo haber hecho el profesor es:
print("1", cafes["1"]) #expresso
creo que es una mejor forma de trabajar porque a medida que los proyectos escalan, la conexion, y la forma que tenemos de escribir ciertas variables es importante, y tener un documento donde sepamos que si nos referiremos a expresso, utilizaremos la palabra expresso solo de el diccionarios cafes, es una buena idea para no tener problemas a futuro.
Antes de hacer el ejercicio me la complique un poquito !!
Pedidos
Clientes
Cobros
¿Cómo evito errores al usar input?
La función input() siempre captura la entrada del usuario como una cadena de texto, incluso si el usuario escribe un número. Para evitar errores de lógica, debes asegurarte de comparar ese valor correctamente. Si tu menú espera opciones numéricas, tienes dos caminos: comparar el resultado directamente con strings o transformar la entrada a un entero. Sin embargo, si decides convertirlo a entero, corres el riesgo de que el programa colapse si el usuario escribe una letra por accidente. La forma más segura en esta etapa inicial es tratar todo como texto y usar un bloque else al final de tus condicionales. Así, cualquier entrada que no coincida exactamente con las opciones esperadas caerá en el else, mostrando un mensaje de error amigable y reiniciando el ciclo.
¿Cuándo debo usar la instrucción pass?
Debes usar pass cuando estás diseñando la estructura de tu programa pero aún no estás listo para escribir la lógica de una función o bloque condicional. Piensa en ello como un letrero de en construcción o un marcador de posición temporal. Python requiere que los bloques de código tengan al menos una línea de instrucción debido a su dependencia de la indentación. Si dejas el bloque vacío, el intérprete lanzará un error de sintaxis. Al colocar pass, le dices a Python que ignore ese espacio por ahora y continúe ejecutando el resto. Es una herramienta excelente para el desarrollo iterativo, permitiéndote probar el flujo principal de tu menú interactivo antes de programar la conexión con bases de datos o la lectura de archivos.
Era un error de jerarquías.
¡Exacto! Ese es el "momento eureka" de la programación.
En Python, la indentación no es solo estética, es la arquitectura de tu lógica. Si mueves un bloque un nivel a la izquierda, le cambias el significado a todo el programa. Es como intentar abrir una puerta que no existe porque te equivocaste de pasillo.
Ahora que ya tienes la jerarquía bajo control, ¿qué es lo siguiente que quieres que haga tu máquina de café? ¿Ya lograste que reste los ingredientes o todavía falta esa parte?
PS C:\Users\CARLO\OneDrive\Escritorio\PYTHON> & C:\Users\CARLO\AppData\Local\Programs\Python\Python314\python.exe c:/Users/CARLO/OneDrive/Escritorio/PYTHON/maquina-de-cafe/main.py Traceback (most recent call last): File "c:\Users\CARLO\OneDrive\Escritorio\PYTHON\maquina-de-cafe\main.py", line 1, in <module> from menu import mostrar_menu ImportError: cannot import name 'mostrar_menu' from 'menu' (c:\Users\CARLO\OneDrive\Escritorio\PYTHON\maquina-de-cafe\menu.py) PS C:\Users\CARLO\OneDrive\E
Carlos, el error es claro: Python te está diciendo que, aunque intentas importar mostrar_menu desde menu.py, no logra encontrar esa función definida ahí.
Cuando esto ocurre, suele ser por una de estas tres razones:
menu.py tenga el archivo guardado con el código de la función def mostrar_menu(): escrito exactamente así.menu.py (todo en minúsculas, sin espacios ni caracteres extraños).menu.py: Si hay un error de indentación o de sintaxis dentro de menu.py, Python a veces falla al cargar el módulo y no puede ver las funciones que contiene.Revisa el contenido de menu.py y asegúrate de que la función esté bien definida. ¿Qué ves dentro de ese archivo?
🫶👍
Yupiii
Vamos
excelente