primer programa de pedido de pizza

Sep 27 2020

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

8 hjpotter92 Sep 27 2020 at 15:47

Bienvenido a la comunidad de CR.

  1. 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 en PIZZA_PRICES.

  2. 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 ).

  3. Pon el flujo de ejecución de tu código dentro delif __name__ == "__main__" bloque.

  4. 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.

  5. 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")
    
  6. 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, con name, phoneetc. atributos. Otra Pizzaclase con asociados typey toppingsetc.


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())
2 AryanParekh Sep 27 2020 at 18:19

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 😁