ilk pizza sipariş programı

Sep 27 2020

Daha önce ilgili herhangi bir deneyim olmadan 40 yaşında yeni bir beceri öğrenmeye çalışıyorum :-) 'Python çarpışma kursu 2e' kitabını satın aldım ve şimdiye kadar öğrendiklerimi bir hafta sonra biraz serbest bırakmaya karar verdim. pizza sipariş etmek için küçük bir program ve kötü alışkanlıklar edinmeden önce biraz geri bildirim almak isterim ..

Öncelikle: Fonksiyonlar ve sınıflar kavramını anladığımı düşünmeme rağmen, oldukça basit olduğu için bunları kullanma ihtiyacını görmedim .. ama şimdi biraz zorlaşıyor. Siparişleri ve fiyatları saklamak için basit listeler ve sözlüklerle sıyrılmaya çalıştım .. Ama aynı pizzadan 2 tane farklı sos ile sipariş etmek istediğinizde sorun çıkıyor (aynı anahtarları alıyorsunuz). Ayrıca, son sipariş için fiyat vermek güzeldi, ancak bir pizzayı siparişten silmek isterseniz, listeden öğeleri silmenin bir yolunu düşünemiyorum.

Belki birisi bana bir çözüm aramam gereken yönde geribildirim verebilir?

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

Yanıtlar

8 hjpotter92 Sep 27 2020 at 15:47

CR topluluğuna hoş geldiniz.

  1. Sürekli beyanları en üstte tutun. PEP8 adlandırma kurallarını (neredeyse) tüm kod tabanı boyunca takip etseniz de, sabit (veya küreseller) olarak adlandırılır UPPER_SNAKE_CASE. Böylece, pizza_pricesolur PIZZA_PRICES.

  2. Çok satırlı içerik için python'da üç tırnaklı dizeler kullanın. Baskı ifadeleriniz çok daha temiz görünür (boş print()ifadelere gerek yoktur ).

  3. İçerdeki kod yürütme akışını koyun bloğu.if __name__ == "__main__"

  4. Pizza / sos listesi ve fiyatları için ayrı değişkenler kullanmak yerine, yalnızca pizza / sos eşlemelerini saklayın ve dict.items()yineleyiciyi kullanarak pizza / sosların listesini alabilirsiniz .

  5. Kod yürütmenin çoğu kullanıcının geçerli girdi seçimine bağlı olduğundan; Giriş çağrısında bu seçenekleri sağlamak daha iyidir. Örneğin:

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

    kullanıcının nereye " y/Y/Yes/N/n/No/Cancel/Quit" yazması gerektiğini netleştirmez . Bu seçim seçimini ayrı bir işleve koymak daha faydalı olacaktır:

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

    şimdi yukarıdakileri şu şekilde arayın:

    add_remove = get_user_choice("would you like to add or remove?", "add", "remove")
    
  6. Programlamaya başlarken, bir sözlük kullanmak yerine ilişkili kaynakları bir sınıfta toplamayı öneririm. Örneğin. bir Customersınıf, ile name, phonevb. nitelikler. Bir başka Pizzailişkili sınıf typeve toppingsvb


4. noktayı genişletmek için:

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

Kullanıcının pizza tercihini sormak:

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

Kodunuzu takip etmek oldukça kolaydır. Bunun için çok iyi iş. Hala iyileştirme için biraz yer var. Çok fazla değişiklik yok.


Temiz ekran

Python, konsolda yazdırılan herhangi bir metni temizlemek için belirli işlevlere sahiptir. Tüm bilgiler için bu sayfayı kontrol edin .

Eğer pencerelerde ise şunları yapabilirsiniz pip install osve daha sonra import osprogramın üst kısmında, bu işlevleri kullanmak için.

Örneğin os.system('pause'), kullanıcıya bir mesaj gösterdikten sonra herhangi bir tuşa tıklamasını beklemek için kullanılabilir.

Kullanım '\n'

Neden birçok boş kelime görüyorum bilmiyorum print()ama sanırım yeni bir satır yazdırmaya çalışıyorsunuz. Varsayılan olarak, print()işlevi kullandıktan sonra metnin sonunda her zaman yeni bir satır olacaktır. Ancak daha fazla yazdırmak istiyorsanız kullanın '\n'. Örneğin, bir şey yazdırdıktan sonra

Yanlış:

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

Çıktı:

Hello World!


Yay

Doğru:

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

Çıktı:

Hello World!


Yay

İşlevleri Kullan

Sipariş alan bölümü bu şekilde bir işleve taşıyın. Ayrıca, işlevi her çağırdığınızda menüye yazdırmak için ShowMenu () adında yeni bir işlev de oluşturabilirsiniz .

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

Yeni bir sipariş almak istediğinizde şimdi ne yaparsınız?

pizza, topping = TakeOrderInput()

Nesne yönelimli programlama

OOP'nin ne olduğunu bilmiyorsanız , kodunuzu daha temiz hale getirmenize ve ayrıca daha iyi kodlamanıza YARDIMCI olmanıza yardımcı olduğu için bunu öğrenmenin zamanı gelmiştir.

Nesne yönelimli programlamayı kullanmanız gerektiğine dair bir kural yoktur, geliştirici olduğunuz için tamamen size bağlıdır ve bu sizin tarzınızdır. Ancak programınız bağlamında sınıfların tipik bir uygulaması burada .

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)

Tabii ki bu sadece küçük bir sınıf uygulaması, daha fazla öğrendikten sonra fatura adresi, vergiler vb. Gibi daha fazla şey ekleyebilirsiniz.

Yeni bir sipariş al

Yaptığımız her şeyle. Kendi başına hiçbir şey yapmaz. Şimdi bu işlevleri kullanmamız gerekiyor

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

Bu, sonunda kullanıcının verdiği tüm siparişlerin bir listesini oluşturacaktır. Herhangi bir şeye erişmek için listeyi yineleyin ve ardından özniteliği alın. Örneğin, toplam maliyeti almak istiyorsanız.

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

print(total)

Final

İşte tüm değişikliklerle birlikte programınız nasıl görünecek?

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

Son kısımda adres, Telefon numarası vb. Hiçbir şey yapmadım, bunları dilediğiniz gibi ekleyebilirsiniz.

Umarım bu incelemeyi faydalı bulmuşsunuzdur 😁