2016-12-03 5 views
1

Python Noobie hier. Für eine Übungsfrage in der Schule sollte ich ein Restaurantmenü machen. Der Benutzer soll seinen Namen eingeben und die Verfahren zum Erstellen eines Sandwichs durchlaufen, nachdem überprüft wurde, ob der Name des Benutzers zuerst gültig ist. Die Frage fordert uns auf, eine Menüfunktion zu erstellen, die die Parameter der Auswahlliste, der minimalen Auswahl und der maximalen Auswahl annehmen soll.Generic Loop für Restaurant Menü

Beispiel: Fragen Sie den Benutzer, wie viele Beläge er auf seinem Sandwich haben möchte. Mit einem Mindestwert von mindestens 1 Topping und maximal 3 Toppings.

Was ich nicht verstehe, ist, wie ich eine generische Schleife machen soll, um diese separaten Listen ohne harte Codierung in den angegebenen Werten zu durchlaufen. Ich hoffe, das macht Sinn. Ich habe versucht, mein Bestes zu geben, aber hier ist ein Beispiel dafür, wie es aussehen soll und wie es aussieht.

Beispiel Output Example of what it's suppose to look like

# Input: 
# user's name 
# wrapper choice (min 1, max 1) 
# protein choice (min 1, max 1) 
# toppings choices (min 1, max 3) 
# sauce choice (min 0, max 1) 

# Processing: 

# Output: 
# User's name followed by their protein choice, wrapper choice, toppings choices, and sauce. 

def menuModule(choiceList, minimumChoices, maximumChoices): 
    order = [] 
    index = 0 

    for i in choiceList: 
     index = index + 1 
     print(i) 
     choice = input("What is your choice?") 

     if choice == index: 
      order.append(choiceList[index]) 

dirtyNames = [ "mud", "dirt", "dust", "booger", "diaper" ] 
valid = True 
wrapChoices = [ "[1]sesame seed bun", "[2]soft tortilla shell" ] 
proteinChoices = [ "[1]chicken", "[2]beef", "[3]tofu" ] 
toppingChoices = [ "[1]tomato", "[2]lettuce", "[3]pickles", "[4]cheese", "[5]onions" ] 
sauceChoices = [ "[1]ketchup", "[2]mayonaise", "[3]McCalorie Secret Sauce" ] 


while valid: 
    name = str(input("What is your name? ")) 
    if name in dirtyNames: 
     print("I'm sorry, that name is not allowed at McThoseguys.") 
     continue 
    elif name.isdecimal() is True: 
     print("I'm sorry, that is not a name.") 
     continue 
    elif any(substring in name.lower() for substring in dirtyNames): 
     print("I'm sorry, that name is not allowed at McThoseguys.") 
    else: 
     print("Hello " + name + ", welcome to McThoseguys!") 
     valid = False 
     menuModule(wrapChoices, 1, 1) 

Antwort

0

Ihre während gültige Schleife das richtige Konzept ist. Dies behandelt ein der Menüs. Jetzt brauchen Sie eine Sekunde Schleife um das durch die verschiedenen Listenabschnitte zu durchlaufen, und eine größere Liste von Listen, um das Menü zu halten.

menu_sections = [ 
       wrapChoices, 
       proteinChoices, 
       toppingChoices, 
       sauceChoices 
       ] 

for section in menu_sections: 
    valid_choice = False 
    while !valid_choice: 
     # Get user's choice 
     # Check validity ... if choice <= len(section) 

Macht Sie das in Bewegung?

0

Dies ist ein kleiner Ausschnitt des Codes läuft:

toppingChoices = [ (1,"tomato"), (2,"lettuce"), (3,"pickles"), (4,"cheese"), (5,"onions") ] 

def menuModule(choiceList, minimumChoices, maximumChoices): 
    order = [] 
    num_choices = 0 
    choices_dict = dict(choiceList) 
    for choice_index in choices_dict: 
     print("[{}] {}".format(choice_index, choices_dict[choice_index])) 

    while num_choices < maximumChoices: 
     choice = input("What is your choice? Type q to exit: ") 
     if choice is "q" and num_choices >= minimumChoices: 
      break 
     elif choice is "q" and num_choices < minimumChoices: 
      print("You must select at least {} items".format(minimumChoices)) 
      continue 

     if int(choice) in choices_dict.keys(): 
      num_choices += 1 
      order += [choices_dict[int(choice)]] 
     else: 
      print("Choice is not in the list") 

    print(order) 


menuModule(toppingChoices, 1, 3) 
0

Ich bin damit einverstanden, dass während gültig ein gutes Konzept für diese Art der Eingabe ist.

Vermeiden Sie [1]tomatoes, [2]onions numerische Markierungen innerhalb der Liste Elemente, es ist keine gute Praxis. Es ist besser, sie zu addieren, wenn die tatsächlichen Objektnamen drucken, wie

for item in choice_list: print ("["+str(index)+"] "+ item) index += 1

[1] sesame seed bun 
[2] soft tortilla shell 

Falls Sie anstelle von [] 1 Tag() zu verwenden entscheiden wird viel einfacher sein, zu halten;)

Außerdem können Sie die Rekursion auf das so gut, vielleicht versuchen Sie zuerst alle Möglichkeiten Funktionen mit ihren Parametern in eine separate Liste hinzugefügt haben, so etwas wie:

choices = [(wrapChoices, 1, 1), (proteinChoices, 1, 1), (toppingChoices, 1, 3), (sauceChoices, 0, 1)] 

T Henne in der Definition können Sie ‚idx‘ Parameter hinzufügen, damit Sie die Funktion von selbst anrufen können, wie:

def menuModule(choice_list, minimumChoices, maximumChoices, idx): 

... 
# and call it at the end again with 
idx += 1 
menuModule(*choices[idx], idx) 

Auf diese Weise können durch alle Entscheidungen können, aber beendet müssen, wenn idx Länge von Entscheidungen erreicht .

Als Praxis, es ist vielleicht besser machen Sie separate Funktionen für jede Wahl und dann später versuchen und machen sie ‚allgemeine‘

hoffe, es hilft ein wenig!