premier programme de commande de pizza
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
Bienvenue dans la communauté CR.
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, lepizza_pricesdeviendraitPIZZA_PRICES.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 ).Placez le flux d'exécution de votre code dans leif __name__ == "__main__" bloc.
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.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")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, avecname,phoneetc. attributs. Une autrePizzaclasse avec associétypeettoppingsetc.
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())
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 😁