primer programa de pedido de pizza
Tratando de aprender una nueva habilidad a los 40 sin ninguna experiencia previa relacionada :-) Compré el libro 'Curso intensivo de Python 2e' y decidí andar un poco después de una semana con lo que he aprendido hasta ahora. Puse todo en un pequeño programa para pedir pizzas y me encantaría recibir comentarios antes de adoptar malos hábitos.
En primer lugar: aunque creo que entiendo el concepto de funciones y clases, no vi la necesidad de usarlas porque era bastante simple ... pero ahora se está poniendo un poco difícil. Traté de salirme con listas simples y diccionarios para almacenar pedidos y precios. Pero surgen problemas cuando quieres pedir 2 pizzas iguales con diferentes ingredientes (obtienes claves idénticas). Además, dar el precio de un pedido final fue bueno, pero si desea eliminar una pizza del pedido, no puedo pensar en una forma de eliminar los artículos de la lista.
¿Quizás alguien pueda darme algunos comentarios en qué dirección debo buscar una solución?
#making the lists
available_pizzas = ['margarita', 'pollo', '4cheese', 'bolognese', 'vegetarian']
available_toppings = ['mushroom', 'onions', 'green pepper', 'extra cheese']
pizza_prices = {'margarita': 5, 'pollo': 7, '4cheese': 6, 'bolognese': 8, 'vegetarian': 6.5}
topping_prices = {'mushroom':1, 'onions': 2, 'green pepper':3, 'extra cheese':4}
sub_total = []
final_order = {}
customer_adress = {}
#ordering a pizza
print("Hi, welcome to our text based pizza ordering")
order_pizza = True
while order_pizza:
print("Please choose a pizza: ")
print()
for pizzas in available_pizzas:
print(pizzas)
print()
while True:
pizza = input("which pizza would you like to order?")
if pizza in available_pizzas:
print(f"You have ordered a {pizza}.")
sub_total.append(pizza_prices[pizza])
break
if pizza not in available_pizzas:
print(f"I am sorry, we currently do not have {pizza}.")
#asking for extra toppings
order_topping = True
print("This is the list of available extra toppings: ")
for toppings in available_toppings:
print(toppings)
print()
while order_topping:
extra_topping = input("Would you like an extra topping? yes or no?")
if extra_topping == "yes":
topping = input("Which one would you like to add?")
if topping in available_toppings:
final_order.setdefault(pizza, [])
final_order[pizza].append(topping)
print(f"I have added {topping}.")
sub_total.append(topping_prices[topping])
else:
print(f"I am sorry, we don't have {topping} available.")
elif extra_topping == "no":
break
extra_pizza = input("Would you like to order another pizza?")
if extra_pizza == "no":
for key, value in final_order.items():
print(f"\nYou have order a {key} pizza with {value}")
check_order = True
while check_order:
print()
order_correct = input("Is this correct? yes/no ")
if order_correct == "yes":
check_order = False
order_pizza = False
if order_correct == "no":
print(final_order)
add_remove = input("would you like to add or remove? ")
if add_remove == "remove":
remove = input("Which pizza would you like to remove? ")
del final_order[remove]
print(final_order)
if add_remove == "add":
check_order = False
#finalizing the order
print(f"\nYour total order price is: ${sum(sub_total)}")
print("Please provide us with your name, adress and phonenumber")
customer_adress['name'] = input("what is your name?")
customer_adress['street_name'] = input("What is your streetname and housenumber?")
customer_adress['postalcode'] = input("What is the postalcode and cityname?")
customer_adress['phonenumber'] = input("What is your phonenumber?")
print()
print(f"Thank you for your order {customer_adress['name']}.")
print()
print("We will deliver your order to this adres ASAP")
print()
print(customer_adress['street_name'])
print(customer_adress['postalcode'])
print()
print(f"we will contact you on {customer_adress['phonenumber']} if anything comes up.")
Respuestas
Bienvenido a la comunidad de CR.
Mantenga declaraciones constantes en la parte superior. Aunque sigue las convenciones de nomenclatura de PEP8 en (casi) toda la base del código, las constantes (o globales) se nombran como
UPPER_SNAKE_CASE. Entonces,pizza_pricesse convertiría enPIZZA_PRICES.Use cadenas entre comillas triples en Python para contenido de varias líneas. Sus declaraciones impresas se verían mucho más limpias (sin necesidad de
print()declaraciones vacías ).Pon el flujo de ejecución de tu código dentro delif __name__ == "__main__" bloque.
En lugar de tener variables separadas para la lista de pizzas / ingredientes y sus precios, mantenga solo el mapeo de pizzas / ingredientes y podrá obtener una lista de pizzas / ingredientes utilizando el
dict.items()iterador.Dado que la mayoría de la ejecución del código depende de la elección de entrada válida por parte del usuario; es mejor proporcionar esas opciones en la llamada de entrada. Por ejemplo:
extra_pizza = input("Would you like to order another pizza?")no deja claro dónde debe escribir el usuario "
y/Y/Yes/N/n/No/Cancel/Quit". Poner esta selección de opciones en una función separada sería más útil:def get_user_choice(message, *choices): prompt = f"{message}\n\nChoicese are: {' '.join(choices)}" while True: choice = input(prompt) if choice in choices: return choice print("Wrong selection")ahora llame a lo anterior de la siguiente manera:
add_remove = get_user_choice("would you like to add or remove?", "add", "remove")Como está comenzando con la programación, le sugiero que reúna los recursos asociados en una clase, en lugar de usar un diccionario. Por ej. una
Customerclase, conname,phoneetc. atributos. OtraPizzaclase con asociadostypeytoppingsetc.
Para ampliar el punto 4:
PIZZA_PRICING = {
"margarita": 5,
"pollo": 7,
"4cheese": 6,
"bolognese": 8,
"vegetarian": 6.5,
}
Preguntar la preferencia del usuario por la pizza:
pizza_choice = get_user_choice("Please choose a pizza:", *PIZZA_PRICING.keys())
Su código es bastante fácil de seguir. Buen trabajo para eso. Todavía hay margen de mejora. No hay muchos cambios.
Pantalla clara
Python tiene ciertas funciones para borrar cualquier texto impreso en la consola. Consulte esta página para obtener toda la información.
si está en Windows, puede pip install osy luego import osen la parte superior de su programa para utilizar estas funciones.
Por ejemplo, os.system('pause')se puede usar para esperar a que el usuario haga clic en cualquier tecla después de mostrarle un mensaje.
Utilizar '\n'
No estoy seguro de por qué veo muchos vacíos print(), pero creo que está intentando imprimir una nueva línea. De forma predeterminada, después de usar la print()función, siempre habrá una nueva línea al final del texto. Pero si desea imprimir más, use '\n'. Por ejemplo, después de haber impreso algo
Incorrecto:
print("Hello,World!")
print()
print("Yay")
Salida:
Hello World!
Yay
Correcto:
print("Hello,World!\n")
print("Yay")
Salida:
Hello World!
Yay
Funciones de uso
Mueva la participación de la orden a una función de esta manera. También puede crear una nueva función llamada ShowMenu () para imprimir en el menú cada vez que llame a la función.
def ShowMenu():
os.system('cls')
print("Available Pizzas:\n")
print(*available_pizzas,sep = ', ')
print("\n\nAvailable Topings:\n")
print(*available_toppings,sep = ', ')
print('\n\n')
def TakeOrderInput():
os.system('cls')
print("Hi, welcome to our text based pizza ordering")
ordering = True
while ordering:
os.system('cls')
ShowMenu()
pizza = input("Please choose a pizza: ")
if pizza not in available_pizzas:
print(f"I am sorry, we currently do not have {pizza}\n.")
os.system('pause')
continue
topping = input("Please choose a topping: ")
if topping not in available_toppings:
print(f"I am sorry, we currently do not have {topping}\n.")
os.system('pause')
continue
print(f"Final order: {pizza} with topping {topping}: ")
ordering = False
return pizza,topping
¿Qué hace ahora cuando quiere tomar un nuevo pedido?
pizza, topping = TakeOrderInput()
Programación orientada a objetos
Si no sabe qué es OOP , es hora de que lo aprenda, ya que lo ayuda a hacer su código mucho más limpio y, además, lo AYUDA a codificar mejor.
No hay ninguna regla de que tengas que usar la programación orientada a objetos, depende completamente de ti ya que eres el desarrollador y es tu estilo. Pero aquí hay una implementación típica de clases en el contexto de su programa.
class Order:
def __init__(self):
taxes = 0 #You can add taxes
pizza,topping = TakeOrderInput()
self.type = pizza
self.topping = topping
self.PizzaPrice = pizza_prices[pizza]
self.ToppingPrice = topping_prices[topping]
self.Total = self.PizzaPrice + self.ToppingPrice
print(self.Total)
Por supuesto, esta es solo una pequeña implementación de las clases, una vez que aprenda más, puede agregar más cosas como dirección de facturación, impuestos, etc.
Toma un nuevo pedido
Con todo lo que hemos hecho. Por sí solo no hace nada. Ahora necesitamos usar estas funciones
choice = True
orders = []
orderchoice = input("Welcome! Would you like to order ? (y/n): ")
if orderchoice == 'n':
print("Have a nice day!")
else:
while choice:
neworder = Order()
orders.append(neworder)
newchoice = input("Would you like to order again? (y/n): ")
if (newchoice) == 'n':
break
Esto finalmente hará una lista de todas las órdenes que el usuario ha dado. Para acceder a cualquier cosa, recorra la lista y luego obtenga el atributo. Por ejemplo, si desea obtener el costo total.
total = 0
for order in orders:
total+=order.Total
print(total)
Final
Así es como se vería su programa con todos los cambios
import os
available_pizzas = ['margarita', 'pollo', '4cheese', 'bolognese', 'vegetarian']
available_toppings = ['mushroom', 'onions', 'green pepper', 'extra cheese']
pizza_prices = {'margarita': 5, 'pollo': 7, '4cheese': 6, 'bolognese': 8, 'vegetarian': 6.5}
topping_prices = {'mushroom':1, 'onions': 2, 'green pepper':3, 'extra cheese':4}
def ShowMenu():
os.system('cls')
print("Available Pizzas:\n")
print(*available_pizzas,sep = ', ')
print("\n\nAvailable Topings:\n")
print(*available_toppings,sep = ', ')
print('\n\n')
def TakeOrderInput():
os.system('cls')
print("Hi, welcome to our text based pizza ordering")
ordering = True
while ordering:
os.system('cls')
ShowMenu()
pizza = input("Please choose a pizza: ")
if pizza not in available_pizzas:
print(f"I am sorry, we currently do not have {pizza}\n.")
os.system('pause')
continue
topping = input("Please choose a topping: ")
if topping not in available_toppings:
print(f"I am sorry, we currently do not have {topping}\n.")
os.system('pause')
continue
print(f"Final order: {pizza} with topping {topping}: ")
ordering = False
return pizza,topping
class Order:
def __init__(self):
taxes = 0 #You can add taxes
pizza,topping = TakeOrderInput()
self.type = pizza
self.topping = topping
self.PizzaPrice = pizza_prices[pizza]
self.ToppingPrice = topping_prices[topping]
self.Total = self.PizzaPrice + self.ToppingPrice
choice = True
orders = []
orderchoice = input("Welcome! Would you like to order ? (y/n): ")
if orderchoice == 'n':
print("Have a nice day!")
else:
while choice:
neworder = Order()
orders.append(neworder)
newchoice = input("Would you like to order again? (y/n): ")
if (newchoice) == 'n':
break
total = 0
for order in orders:
total+=order.Total
print("Total: ",total, '$')
No he hecho nada en la parte final, que fue la dirección, el número de teléfono, etc., puede agregar esas cosas como desee.
Espero que haya encontrado útil esta revisión 😁