programma per la prima pizza
Sto cercando di imparare una nuova abilità a 40 anni senza alcuna precedente esperienza correlata :-) Ho comprato il libro 'Python crash course 2e' e ho deciso di andare a ruota libera dopo una settimana con quello che ho imparato finora .. Ho messo tutto in un piccolo programma per ordinare pizze e mi piacerebbe un po 'di feedback prima di prendere cattive abitudini ..
Prima di tutto: anche se penso di aver capito il concetto di funzioni e classi, non ho visto la necessità di usarle perché era abbastanza semplice .. ma ora sta diventando un po 'difficile. Ho provato a farla franca con semplici elenchi e dizionari per memorizzare ordini e prezzi .. Ma emergono problemi quando si vogliono ordinare 2 pizze uguali con condimenti diversi (si ottengono chiavi identiche). Inoltre, dare il prezzo per un ordine finale è stato bello, ma se vuoi eliminare una pizza dall'ordine, non riesco a pensare a un modo per eliminare gli elementi dall'elenco.
Forse qualcuno può darmi un feedback in quale direzione dovrei cercare una soluzione?
#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.")
Risposte
Benvenuto nella community CR.
Mantieni le dichiarazioni costanti in alto. Sebbene si seguano le convenzioni di denominazione PEP8 in (quasi) l'intera base di codice, le costanti (o globali) sono denominate come
UPPER_SNAKE_CASE. Quindi,pizza_pricessarebbe diventatoPIZZA_PRICES.Usa stringhe tra virgolette in Python per contenuti su più righe. Le tue dichiarazioni di stampa sarebbero molto più pulite (non c'è bisogno di
print()dichiarazioni vuote ).Metti il flusso di esecuzione del tuo codice all'interno delif __name__ == "__main__" blocco.
Invece di avere variabili separate per l'elenco di pizze / condimenti e i loro prezzi, mantieni solo la mappatura di pizza / condimenti e puoi ottenere l'elenco di pizze / condimenti usando l'
dict.items()iteratore.Poiché la maggior parte dell'esecuzione del codice dipende da una scelta di input valida da parte dell'utente; è meglio fornire queste scelte nella chiamata di input. Ad esempio:
extra_pizza = input("Would you like to order another pizza?")non chiarisce dove l'utente deve digitare "
y/Y/Yes/N/n/No/Cancel/Quit". Mettere questa selezione di scelta in una funzione separata sarebbe più 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")ora chiama quanto sopra come segue:
add_remove = get_user_choice("would you like to add or remove?", "add", "remove")Quando inizi con la programmazione, suggerirei di raccogliere le risorse associate in una classe, invece di utilizzare un dizionario. Per es. una
Customerclasse, conname,phoneecc. attributi. Un'altraPizzaclasse con associatitypeedtoppingsecc.
Per approfondire il punto 4:
PIZZA_PRICING = {
"margarita": 5,
"pollo": 7,
"4cheese": 6,
"bolognese": 8,
"vegetarian": 6.5,
}
Chiedere la preferenza dell'utente per la pizza:
pizza_choice = get_user_choice("Please choose a pizza:", *PIZZA_PRICING.keys())
Il tuo codice è abbastanza facile da seguire. Quindi buon lavoro per quello. C'è ancora qualche margine di miglioramento. Non molti cambiamenti.
Schermo pulito
Python ha alcune funzioni per cancellare qualsiasi testo stampato sulla console. Controlla questa pagina per tutte le informazioni.
se sei su Windows, puoi pip install ose poi import osnella parte superiore del tuo programma per usare queste funzioni.
Ad esempio, os.system('pause')può essere utilizzato per attendere che l'utente faccia clic su qualsiasi tasto dopo avergli mostrato un messaggio.
Uso '\n'
Non sono sicuro del motivo per cui vedo molti vuoti print()ma penso che tu stia cercando di stampare una nuova riga. Per impostazione predefinita, dopo aver utilizzato la print()funzione ci sarà sempre una nuova riga alla fine del testo. Ma se vuoi stampare di più, usa '\n'. Ad esempio, dopo aver stampato qualcosa
Sbagliato:
print("Hello,World!")
print()
print("Yay")
Produzione:
Hello World!
Yay
Corretta:
print("Hello,World!\n")
print("Yay")
Produzione:
Hello World!
Yay
Usa funzioni
Sposta la parte che prende parte all'ordine in una funzione in questo modo. È inoltre possibile creare una nuova funzione denominata ShowMenu () da stampare nel menu ogni volta che si chiama la funzione.
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
Cosa fai adesso quando vuoi prendere un nuovo ordine?
pizza, topping = TakeOrderInput()
Programmazione orientata agli oggetti
Se non sai cosa sia l' OOP , è ora che lo impari in quanto ti aiuta a rendere il tuo codice molto più pulito e inoltre AIUTA a programmare meglio.
Non c'è nessuna regola per cui devi usare la programmazione orientata agli oggetti, dipende completamente da te in quanto sei lo sviluppatore ed è il tuo stile. Ma ecco una tipica implementazione delle classi nel contesto del tuo programma.
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)
Ovviamente questa è solo una piccola implementazione di classi, una volta che impari di più puoi aggiungere più cose come indirizzo di fatturazione, tasse eccetera.
Prendi un nuovo ordine
Con tutto quello che abbiamo fatto. Di per sé non fa nulla. Dobbiamo ora utilizzare queste funzioni
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
Questo farà finalmente un elenco di tutti gli ordini che l'utente ha dato. Per accedere a qualsiasi cosa, iterare l'elenco e quindi ottenere l'attributo. Ad esempio, se vuoi ottenere il costo totale.
total = 0
for order in orders:
total+=order.Total
print(total)
Finale
Ecco come sarebbe il tuo programma con tutte le modifiche
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, '$')
Non ho fatto nulla alla parte finale che era l'indirizzo, il numero di telefono eccetera, puoi aggiungere quelle cose come desideri.
Spero che tu abbia trovato utile questa recensione 😁