program pemesanan pizza pertama

Sep 27 2020

Mencoba mempelajari keterampilan baru pada usia 40 tahun tanpa pengalaman terkait sebelumnya :-) Membeli buku 'Python crash course 2e' dan memutuskan untuk sedikit freewheel setelah seminggu dengan apa yang telah saya pelajari sejauh ini .. Saya memasukkan semuanya ke dalam program kecil untuk memesan pizza dan saya akan sangat senang dengan beberapa tanggapan sebelum saya mengambil kebiasaan buruk ..

pertama: meskipun saya pikir saya memahami konsep fungsi dan kelas, saya tidak melihat perlunya menggunakan ini karena cukup sederhana .. tetapi sekarang menjadi agak sulit. Saya mencoba lolos dengan daftar dan kamus sederhana untuk menyimpan pesanan dan harga .. Tetapi masalah muncul ketika Anda ingin memesan 2 pizza yang sama dengan topping berbeda (Anda mendapatkan kunci yang sama). Juga, memberikan harga untuk pesanan akhir itu bagus, tetapi jika Anda ingin menghapus pizza dari pesanan, saya tidak dapat memikirkan cara untuk menghapus item dari daftar.

Mungkin seseorang dapat memberi saya umpan balik tentang arah mana saya harus mencari solusi?

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

Jawaban

8 hjpotter92 Sep 27 2020 at 15:47

Selamat datang di komunitas CR.

  1. Pertahankan deklarasi konstan di atas. Meskipun Anda mengikuti konvensi penamaan PEP8 di seluruh (hampir) seluruh basis kode, konstanta (atau global) dinamai sebagai UPPER_SNAKE_CASE. Jadi, pizza_pricesjadinya PIZZA_PRICES.

  2. Gunakan string yang dikutip tiga kali dalam python untuk konten multiline. Pernyataan cetak Anda akan terlihat jauh lebih bersih (tidak perlu print()pernyataan kosong ).

  3. Letakkan alur eksekusi kode Anda di dalamif __name__ == "__main__" blok.

  4. Alih-alih memiliki variabel terpisah untuk daftar pizza / topping dan harganya, simpan hanya pemetaan pizza / topping, dan Anda bisa mendapatkan daftar pizza / topping menggunakan dict.items()iterator.

  5. Karena mayoritas eksekusi kode bergantung pada pilihan input yang valid dari pengguna; lebih baik memberikan pilihan tersebut dalam panggilan masukan. Misalnya:

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

    tidak menjelaskan di mana pengguna harus mengetik " y/Y/Yes/N/n/No/Cancel/Quit". Menempatkan pilihan pilihan ini dalam fungsi terpisah akan lebih membantu:

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

    sekarang panggil di atas sebagai berikut:

    add_remove = get_user_choice("would you like to add or remove?", "add", "remove")
    
  6. Saat Anda mulai dengan pemrograman, saya sarankan mengumpulkan sumber daya terkait ke dalam kelas, daripada menggunakan kamus. Misalnya. sebuah Customerkelas, dengan name, phonedll atribut. PizzaKelas lain dengan asosiasi typedan toppingslain - lain.


Untuk memperluas poin 4:

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

Menanyakan preferensi pengguna untuk pizza:

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

Kode Anda cukup mudah diikuti. Kerja bagus untuk itu. Masih ada ruang untuk perbaikan. Tidak banyak perubahan.


Hapus layar

Python memiliki fungsi tertentu untuk menghapus teks apa pun yang tercetak di konsol. Periksa halaman ini untuk semua informasi.

jika Anda menggunakan windows, Anda dapat pip install osdan kemudian import osdi bagian atas program Anda untuk menggunakan fungsi-fungsi ini.

Misalnya, os.system('pause')dapat digunakan untuk menunggu pengguna mengklik tombol apa saja setelah Anda menampilkan pesan kepada mereka.

Menggunakan '\n'

Saya tidak yakin mengapa saya melihat banyak yang kosong print()tetapi saya pikir Anda mencoba untuk mencetak baris baru. Secara default setelah menggunakan print()fungsi akan selalu ada baris baru di akhir teks. Tetapi jika Anda ingin mencetak lebih banyak, gunakan '\n'. Misalnya, Setelah Anda mencetak sesuatu

Salah:

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

Keluaran:

Hello World!


Yay

Benar:

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

Keluaran:

Hello World!


Yay

Gunakan Fungsi

Pindahkan bagian pengambilan pesanan ke dalam fungsi dengan cara ini. Anda juga dapat membuat fungsi baru yang disebut ShowMenu () untuk mencetak ke menu setiap kali Anda memanggil fungsi tersebut.

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

Apa yang Anda lakukan sekarang saat Anda ingin mengambil pesanan baru?

pizza, topping = TakeOrderInput()

Pemrograman berorientasi objek

Jika Anda tidak tahu apa itu OOP , inilah saatnya Anda mempelajarinya karena Ini membantu Anda membuat kode Anda lebih bersih dan terlebih lagi MEMBANTU Anda membuat kode dengan lebih baik.

Tidak ada aturan bahwa Anda harus menggunakan pemrograman berorientasi objek, itu sepenuhnya terserah Anda karena Anda adalah pengembang dan itu adalah gaya Anda. Tapi di sini adalah implementasi tipikal kelas dalam konteks program Anda.

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)

Tentu saja ini hanyalah implementasi kelas kecil, setelah Anda mempelajari lebih lanjut, Anda dapat menambahkan lebih banyak hal seperti alamat penagihan, pajak, dan sebagainya.

Ambil pesanan baru

Dengan semua yang telah kami lakukan. Dengan sendirinya itu tidak melakukan apa-apa. Sekarang kita perlu menggunakan fungsi ini

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

Ini akhirnya akan membuat daftar semua pesanan yang telah diberikan pengguna. Untuk mengakses apa pun, lakukan iterasi melalui daftar dan kemudian dapatkan atributnya. Misalnya, jika Anda ingin mendapatkan total biaya.

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

print(total)

Terakhir

Berikut tampilan program Anda dengan semua perubahannya

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

Saya belum melakukan apa pun sampai bagian terakhir yaitu alamatnya, Nomor telepon dan sebagainya, Anda dapat menambahkan hal-hal itu sesuai keinginan.

Saya harap Anda menemukan ulasan ini bermanfaat 😁