premier programme de commande de pizza

Sep 27 2020

Essayer d'apprendre une nouvelle compétence à 40 ans sans aucune expérience connexe préalable :-) J'ai acheté le livre 'Python crash course 2e' et j'ai décidé de rouler un peu avec après une semaine avec ce que j'ai appris jusqu'à présent .. J'ai tout mis dans un petit programme pour commander des pizzas et j'aimerais avoir des commentaires avant de prendre de mauvaises habitudes ..

Tout d'abord: bien que je pense comprendre le concept de fonctions et de classes, je n'ai pas vu la nécessité de les utiliser car c'était assez simple ... mais maintenant ça devient un peu difficile. J'ai essayé de m'en sortir avec des listes simples et des dictionnaires pour stocker les commandes et les prix .. Mais des problèmes surgissent quand on veut commander 2 des mêmes pizzas avec des garnitures différentes (on obtient des clés identiques). De plus, donner le prix d'une commande finale était bien, mais si vous souhaitez supprimer une pizza de la commande, je ne peux pas penser à un moyen de supprimer les articles de la liste.

Peut-être que quelqu'un peut me dire dans quelle direction je devrais chercher une solution?

#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.")   
    

Réponses

8 hjpotter92 Sep 27 2020 at 15:47

Bienvenue dans la communauté CR.

  1. Gardez les déclarations constantes en haut. Bien que vous suiviez les conventions de dénomination PEP8 dans (presque) toute la base de code, les constantes (ou globales) sont nommées UPPER_SNAKE_CASE. Ainsi, le pizza_pricesdeviendrait PIZZA_PRICES.

  2. Utilisez des chaînes entre guillemets triples en python pour le contenu multiligne. Vos instructions d'impression sembleraient beaucoup plus propres (pas besoin d' print()instructions vides ).

  3. Placez le flux d'exécution de votre code dans leif __name__ == "__main__" bloc.

  4. Au lieu d'avoir des variables séparées pour la liste des pizzas / garnitures et leurs prix, gardez uniquement le mappage des pizzas / garnitures, et vous pouvez obtenir la liste des pizzas / garnitures à l'aide de l' dict.items()itérateur.

  5. Puisque la majorité de l'exécution du code dépend du choix d'entrée valide de l'utilisateur; il est préférable de fournir ces choix dans l'appel d'entrée. Par exemple:

    extra_pizza = input("Would you like to order another pizza?")
    

    ne précise pas où l'utilisateur doit taper " y/Y/Yes/N/n/No/Cancel/Quit". Mettre cette sélection de choix dans une fonction distincte serait plus utile:

    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")
    

    maintenant appelez ci-dessus comme suit:

    add_remove = get_user_choice("would you like to add or remove?", "add", "remove")
    
  6. Au début de la programmation, je vous suggère de rassembler les ressources associées dans une classe, au lieu d'utiliser un dictionnaire. Pour par exemple. une Customerclasse, avec name, phoneetc. attributs. Une autre Pizzaclasse avec associé typeet toppingsetc.


Pour développer le point 4:

PIZZA_PRICING = {
    "margarita": 5,
    "pollo": 7,
    "4cheese": 6,
    "bolognese": 8,
    "vegetarian": 6.5,
}

Demander la préférence de l'utilisateur pour la pizza:

pizza_choice = get_user_choice("Please choose a pizza:", *PIZZA_PRICING.keys())
2 AryanParekh Sep 27 2020 at 18:19

Votre code est assez simple à suivre. Tellement bon travail pour ça. Il y a encore place à amélioration. Pas beaucoup de changements.


Écran propre

Python a certaines fonctions pour effacer tout texte imprimé sur la console. Consultez cette page pour toutes les informations.

si vous êtes sous windows, vous pouvez pip install oset puis import osen haut de votre programme utiliser ces fonctions.

Par exemple, os.system('pause')peut être utilisé pour attendre que l'utilisateur clique sur une touche une fois que vous lui avez montré un message.

Utilisation '\n'

Je ne sais pas pourquoi je vois beaucoup de vides print(), mais je pense que vous essayez d 'imprimer une nouvelle ligne. Par défaut, après avoir utilisé la print()fonction, il y aura toujours une nouvelle ligne à la fin du texte. Mais si vous souhaitez imprimer davantage, utilisez '\n'. Par exemple, après avoir imprimé quelque chose

Faux:

print("Hello,World!")
print()
print("Yay")

Production:

Hello World!


Yay

Correct:

print("Hello,World!\n")
print("Yay")

Production:

Hello World!


Yay

Utiliser les fonctions

Déplacez le participant de commande dans une fonction de cette manière. Vous pouvez également créer une nouvelle fonction appelée ShowMenu () à imprimer dans le menu chaque fois que vous appelez la fonction.

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

Que faites-vous maintenant lorsque vous souhaitez prendre une nouvelle commande?

pizza, topping = TakeOrderInput()

Programmation orientée objet

Si vous ne savez pas ce qu'est la POO , il est temps que vous en appreniez davantage car cela vous aide à rendre votre code beaucoup plus propre et en plus vous AIDE à mieux coder.

Il n'y a pas de règle selon laquelle vous devez utiliser la programmation orientée objet, cela dépend entièrement de vous car vous êtes le développeur et c'est votre style. Mais voici une implémentation typique des classes dans le contexte de votre programme.

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)

Bien sûr, il ne s'agit que d'une petite implémentation de classes, une fois que vous en saurez plus, vous pouvez ajouter d'autres éléments tels que l'adresse de facturation, les taxes, etc.

Prendre une nouvelle commande

Avec tout ce que nous avons fait. À lui seul, il ne fait rien. Nous devons maintenant utiliser ces fonctions

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

Cela fera enfin une liste de toutes les commandes que l'utilisateur a passées. Pour accéder à tout, parcourez la liste, puis obtenez l'attribut. Par exemple, si vous souhaitez obtenir le coût total.

total = 0
for order in orders:
    total+=order.Total

print(total)

Final

Voici à quoi ressemblerait votre programme avec tous les changements

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, '$')

Je n'ai rien fait pour la dernière partie qui était l'adresse, le numéro de téléphone et cetera, vous pouvez ajouter ces choses comme vous le souhaitez.

J'espère que vous avez trouvé cet avis utile 😁