Как проверить правильность ввода пользователя для списка / набора пицц? - PullRequest
0 голосов
/ 26 апреля 2018

Извините, если этот вопрос задавался ранее, но я не смог найти точный ответ или достаточно близко в других вопросах. Я также довольно новичок в Python.

Я ищу способ проверить правильность ввода пользователя при выборе пиццы из кортежа. (например, если в моем случае пользователь вводит что-либо больше 11, я бы хотел, чтобы программа перезапустила функцию.)

Вот полный код моей программы.

def amountFunction():
    global pizzaAmount
    pizzaAmount = []
    while pizzaAmount is not int:
        try:
            pizzaAmount = int(input("Please input the amount of pizzas you would like - (a maximum of 5)"))
        except ValueError:
            print("Please input a value above 0 or less than 5")
        except pizzaAmount ==0 or pizzaAmount > 5:
            print("Please input a value above 0 or less than 5")
            amountFunction()
        else:
            print("Your amount of pizzas is " + str(pizzaAmount))
            break


amountFunction()

def selectFunction():
    global pizzas_with_prices
    pizzas_with_prices = [("BBQ Meatlovers", 8.5), ("Chicken Supreme", 8.5), ("Peri-Peri Chicken", 8.5),
                      ("Vegorama", 8.5), ("Cheesy Bacon Hawaiian", 8.5), ("Beef and Onion", 8.5),
                      ("Simply Cheese", 8.5), ("Ham and Cheese", 13.5), ("Hawaiian", 13.5),
                      ("Veg Trio", 13.5), ("Peperoni", 13.5), ("Wedge", 13.5)]
    for index, pizza in enumerate(pizzas_with_prices):
    print("%d %s: $%s" % (index, pizza[0], pizza[1]))
    global selected_pizza
    selected_pizza=[]
    for n in range(pizzaAmount):
        while selected_pizza is not int:
            try:
                selected_pizza = selected_pizza + [int(input("Choose a pizza: "))]
            except ValueError:
                print("Please select a pizza on the list")
            else:
                break
    global total_price
    total_price = 0
    for selected in selected_pizza:
        total_price += pizzas_with_prices[selected][1]


selectFunction()

def totalFunction():
    print("Here are your selected pizzas")
    for selected in selected_pizza:
        print("%s: $%s" % pizzas_with_prices[selected])

    print("Here is the total price of pizzas:${}".format(total_price))

totalFunction()

Эта функция ниже - def selectFunction ():

def selectFunction():
    global pizzas_with_prices
    pizzas_with_prices = [("BBQ Meatlovers", 8.5), ("Chicken Supreme", 8.5), ("Peri-Peri Chicken", 8.5),
                      ("Vegorama", 8.5), ("Cheesy Bacon Hawaiian", 8.5), ("Beef and Onion", 8.5),
                      ("Simply Cheese", 8.5), ("Ham and Cheese", 13.5), ("Hawaiian", 13.5),
                      ("Veg Trio", 13.5), ("Peperoni", 13.5), ("Wedge", 13.5)]
    for index, pizza in enumerate(pizzas_with_prices):
       print("%d %s: $%s" % (index, pizza[0], pizza[1]))
    global selected_pizza
    selected_pizza=[]
    for n in range(pizzaAmount):
        while selected_pizza is not int:
            try:
                selected_pizza = selected_pizza + [int(input("Choose a pizza: "))]
            except ValueError:
                print("Please select a pizza on the list")
            else:
                break
    global total_price
    total_price = 0
    for selected in selected_pizza:
        total_price += pizzas_with_prices[selected][1]


selectFunction()

Как мне проверить, есть ли вход пользователя в списке / наборе пицц? (например, если пользователь вводит 999 для selected_pizza, я бы хотел, чтобы программа повторяла selectFunction () снова до тех пор, пока не будут выбраны действительные пиццы, затем перейдите к суммированию цены пицц и затем перейдите к следующей функции totalFunction () )

Я пытался использовать IndexError: но, похоже, я не понимаю, как его использовать, так как он, похоже, не работает, либо пропускает и выдает ошибку, либо входит в бесконечный цикл. По сути, мне нужен способ обработки ошибки индекса.

Ниже приведен пример того, что происходит в данный момент.

Please input the amount of pizzas you would like - (a maximum of 5)2
Your amount of pizzas is 2
0 BBQ Meatlovers: $8.5
1 Chicken Supreme: $8.5
2 Peri-Peri Chicken: $8.5
3 Vegorama: $8.5
4 Cheesy Bacon Hawaiian: $8.5
5 Beef and Onion: $8.5
6 Simply Cheese: $8.5
7 Ham and Cheese: $13.5
8 Hawaiian: $13.5
9 Veg Trio: $13.5
10 Pepperoni: $13.5
11 Wedge: $13.5
Choose a pizza: 23456
Choose a pizza: 4235464
Traceback (most recent call last):
  File "C:\Users\ilyas rosslan\Documents\Python Work\tester.py", line 45, in 
<module>
   selectFunction()
  File "C:\Users\ilyas rosslan\Documents\Python Work\tester.py", line 42, in 
selectFunction
    total_price += pizzas_with_prices[selected][1]
IndexError: list index out of range

Буду очень признателен, если кто-нибудь сможет помочь. Спасибо

Ильяс.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Из того, что я понимаю, я бы сделал это так. Я создал отдельную функцию для выбора одной действительной пиццы, а затем добавил в функцию выбор нескольких пицц.

def amountFunction():
    try:
        pizzaAmount = int(input("Please input the amount of pizzas you would like - (a maximum of 5)"))
        if pizzaAmount > 0 and pizzaAmount <=5:
            return pizzaAmount
        else:
            print("Please input a value above 0 or less than 5")
            return amountFunction()
    except ValueError:
        return amountFunction()
    except KeyboardInterrupt:
        print("user aborted the program")
        return 0


def selectOnePizza(pizzas_with_prices):
    try:
        selected_pizza = int(input("Choose a pizza: "))
        if selected_pizza >= 0 and selected_pizza <len(pizzas_with_prices):
            return selected_pizza
        else:
            print("Please input a value above {} or less than {}".format(0,len(pizzas_with_prices)))
            return selectOnePizza(pizzas_with_prices)
    except ValueError:
        print("Please input a value above {} or less than {}".format(0,len(selected_pizza)))
        return selectOnePizza(pizzas_with_prices)
    except KeyboardInterrupt:
        print("user aborted the program")
        return -1


def selectManyPizzas(pizzas_with_prices, pizzaAmount):

    for index, pizza in enumerate(pizzas_with_prices):
       print("%d %s: $%s" % (index, pizza[0], pizza[1]))
    selected_pizza=[]

    for n in range(pizzaAmount):
        selected_pizza.append(selectOnePizza(pizzas_with_prices))
    return selected_pizza

def showSlectedPizzas(pizzas_with_prices, selected_pizza):
    print("Here are your selected pizzas")
    total_price = 0
    for selected in selected_pizza:
        print("%s: $%s" % pizzas_with_prices[selected])
        total_price = total_price + pizzas_with_prices[selected][1]

    print("Here is the total price of pizzas:${}".format(total_price))


pizzaAmount = amountFunction()
pizzas_with_prices = [("BBQ Meatlovers", 8.5), ("Chicken Supreme", 8.5), ("Peri-Peri Chicken", 8.5),
                      ("Vegorama", 8.5), ("Cheesy Bacon Hawaiian", 8.5), ("Beef and Onion", 8.5),
                      ("Simply Cheese", 8.5), ("Ham and Cheese", 13.5), ("Hawaiian", 13.5),
                      ("Veg Trio", 13.5), ("Peperoni", 13.5), ("Wedge", 13.5)]
selected_pizza = selectManyPizzas(pizzas_with_prices,pizzaAmount)

showSlectedPizzas(pizzas_with_prices, selected_pizza)

Надеюсь, это поможет.

0 голосов
/ 26 апреля 2018

Прочитайте ввод, подтвердите его, затем добавьте его в список selected_pizza.

for n in range(pizzaAmount):
    while True:
        try:
            selection = int(input("Choose a pizza: "))
            if selection in range(len(pizza_with_prices)):
                selected_pizza.append(selection)
                break
            else:
                print("Please select one of the listed pizza numbers")
        except ValueError:
            print("Please select a pizza on the list")

while selected_pizza is not int: неверно. Это условие всегда будет истинным, поскольку selected_pizza является списком, а список не является int.

Вам также следует прекратить использовать так много глобальных переменных. amountFunction() должен вернуть сумму, а затем она должна быть передана в качестве аргумента selectFunction().

...