pierwszy program do zamawiania pizzy
Próbowałem nauczyć się nowej umiejętności w wieku 40 lat bez żadnego wcześniejszego doświadczenia :-) Kupiłem książkę „Awaryjny kurs języka Python 2e” i po tygodniu zdecydowałem się na trochę swobodny bieg z tym, czego nauczyłem się do tej pory. mały program do zamawiania pizzy i chciałbym otrzymać opinię, zanim podejmę złe nawyki.
po pierwsze: chociaż wydaje mi się, że rozumiem pojęcie funkcji i klas, nie widziałem potrzeby ich używania, ponieważ było to dość proste… ale teraz robi się to trochę trudne. Próbowałem uciec z prostymi listami i słownikami do przechowywania zamówień i cen .. Ale kłopoty pojawiają się, gdy chcesz zamówić 2 takie same pizze z różnymi dodatkami (dostajesz identyczne klucze). Również podanie ceny za ostateczne zamówienie było miłe, ale jeśli chcesz usunąć pizzę z zamówienia, nie mogę wymyślić sposobu na usunięcie pozycji z listy.
Może ktoś może dać mi jakąś informację zwrotną, w jakim kierunku mam szukać rozwiązania?
#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.")
Odpowiedzi
Witamy w społeczności CR.
Zachowaj stałe deklaracje u góry. Chociaż przestrzegasz konwencji nazewnictwa PEP8 w (prawie) całej bazie kodu, stałe (lub globalne) są nazywane jako
UPPER_SNAKE_CASE. Więcpizza_pricesstanie sięPIZZA_PRICES.Użyj ciągów w potrójnym cudzysłowie w Pythonie dla zawartości wielowierszowej. Twoje instrukcje print wyglądałyby o wiele czysto (nie ma potrzeby stosowania pustych
print()instrukcji).Umieścić przepływ wykonywanie kodu wewnątrz wif __name__ == "__main__" bloku.
Zamiast oddzielnych zmiennych dla listy pizzy / dodatków i ich cen, zachowaj tylko mapowanie pizzy / dodatków, a listę pizzy / dodatków możesz uzyskać za pomocą
dict.items()iteratora.Ponieważ większość wykonania kodu zależy od prawidłowego wyboru danych wejściowych przez użytkownika; lepiej jest podać te opcje w wywołaniu wejściowym. Na przykład:
extra_pizza = input("Would you like to order another pizza?")nie wyjaśnia, gdzie użytkownik powinien wpisać „
y/Y/Yes/N/n/No/Cancel/Quit”. Bardziej pomocne byłoby umieszczenie tego wyboru w osobnej funkcji: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")teraz zadzwoń do powyższego w następujący sposób:
add_remove = get_user_choice("would you like to add or remove?", "add", "remove")Rozpoczynając programowanie, sugerowałbym zebranie powiązanych zasobów w klasę, zamiast używania słownika. Np.
Customerklasa, zname,phoneitd atrybutów. InnaPizzaklasa z Associatedtypeitoppingsetc.
Aby rozwinąć punkt 4:
PIZZA_PRICING = {
"margarita": 5,
"pollo": 7,
"4cheese": 6,
"bolognese": 8,
"vegetarian": 6.5,
}
Pytanie użytkownika o preferencje dotyczące pizzy:
pizza_choice = get_user_choice("Please choose a pizza:", *PIZZA_PRICING.keys())
Twój kod jest dość łatwy do zrozumienia. Dobra robota. Nadal jest miejsce na poprawę. Nie ma wielu zmian.
Czysty ekran
Python ma pewne funkcje, które usuwają tekst drukowany na konsoli. Sprawdź tę stronę, aby uzyskać wszystkie informacje.
jeśli jesteś w systemie Windows, możesz, pip install osa następnie import osu góry swojego programu, korzystać z tych funkcji.
Na przykład os.system('pause')może służyć do czekania, aż użytkownik kliknie dowolny klawisz po wyświetleniu mu komunikatu.
Posługiwać się '\n'
Nie jestem pewien, dlaczego widzę wiele pustych print()znaków, ale myślę, że próbujesz wydrukować nowy wiersz. Domyślnie po użyciu print()funkcji na końcu tekstu zawsze będzie nowa linia. Ale jeśli chcesz drukować więcej, użyj '\n'. Na przykład po wydrukowaniu czegoś
Źle:
print("Hello,World!")
print()
print("Yay")
Wynik:
Hello World!
Yay
Poprawny:
print("Hello,World!\n")
print("Yay")
Wynik:
Hello World!
Yay
Użyj funkcji
W ten sposób przenieś część przyjmującą zamówienie do funkcji. Możesz także utworzyć nową funkcję o nazwie ShowMenu (), aby drukować do menu za każdym razem, gdy wywołasz tę funkcję.
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
Co robisz teraz, gdy chcesz przyjąć nowe zamówienie?
pizza, topping = TakeOrderInput()
Programowanie obiektowe
Jeśli nie wiesz, czym jest OOP , nadszedł czas, aby się o tym dowiedzieć, ponieważ pomaga to uczynić kod znacznie czystszym, a ponadto POMAGA w kodowaniu lepiej.
Nie ma zasady, że musisz używać programowania obiektowego, zależy to całkowicie od Ciebie, ponieważ jesteś programistą i to jest Twój styl. Ale tutaj jest typowa implementacja klas w kontekście twojego programu.
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)
Oczywiście to tylko niewielka implementacja zajęć, gdy nauczysz się więcej, możesz dodać więcej rzeczy, takich jak adres rozliczeniowy, podatki i tak dalej.
Złóż nowe zamówienie
Z tym wszystkim, co zrobiliśmy. Sam w sobie nic nie robi. Musimy teraz korzystać z tych funkcji
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
To ostatecznie utworzy listę wszystkich zamówień, które złożył użytkownik. Aby uzyskać dostęp do czegokolwiek, wykonaj iterację po liście, a następnie pobierz atrybut. Na przykład, jeśli chcesz uzyskać całkowity koszt.
total = 0
for order in orders:
total+=order.Total
print(total)
Finał
Oto jak wyglądałby Twój program ze wszystkimi zmianami
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, '$')
Nie zrobiłem nic w ostatniej części, którą był adres, numer telefonu i tak dalej, możesz dodać te rzeczy, jak chcesz.
Mam nadzieję, że ta opinia była dla Ciebie przydatna 😁