Да или нет ответа от пользователя с опцией проверки и перезапуска?

#python #validation #loops #while-loop #restart

#python #проверка #циклы #цикл while #перезапуск

Вопрос:

(py) На данный момент приведенный ниже код не проверяет / не выводит сообщения об ошибках, когда пользователь вводит что-то другое, кроме двух вариантов «y» и «n», потому что это в цикле while.

 again2=input("Would you like to calculate another GTIN-8 code? Type 'y' for Yes and 'n' for No. ").lower() #**

    while again2 == "y":
        print("nOK! Thanks for using this GTIN-8 calculator!nn")
        restart2()
        break                                                                                                                    #Break ends the while loop

restart2()
  

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

 if again2 != "y" or "n"
   print("Not a valid choice, try again")
   #Here would be a statement that sends the program back to the line labelled with a **
  

Итак, когда ввод пользователя не равен «y» или «n», программа вернется к исходному оператору и попросит пользователя ввести снова. Есть идеи, которые по-прежнему поддерживают эффективный код с как можно меньшим количеством строк? Спасибо!

Комментарии:

1. if again2.lower() not in ["y","n"]:

Ответ №1:

 def get_choice(prompt="Enter y/n?",choices=["Y","y","n","N"],error="Invalid choice"):
    while True:
        result = input(prompt)
        if result in choices: return result
        print(error)
  

вероятно, это хороший общий способ решения этой проблемы

 result = get_choice("Enter A,B, or C:",choices=list("ABCabc"),error="Thats not A or B or C")
  

вы могли бы грубо сделать его не чувствительным к регистру … или добавить другие типы критериев (например, должно быть целое число от 26 до 88)

Комментарии:

1. вы могли бы даже обойтись choices="ABCabc" без преобразования в list . Также укажите, что он работает только с использованием python 3.

2. но тогда он будет принимать «AB» или «Ca» и т.д. (первоначально я делал именно это)

3. Да, вы правы! ну, вы можете противостоять этому, также проверив размер ответа.

4. казалось проще просто обернуть это list : P

Ответ №2:

Рекурсивное решение:

 def get_input():
    ans = input('Y/N? ') #Use raw_input in python2
    if ans.lower() in ('y', 'n'):
        return ans
    else:
        print('Please try again.')
        return get_input()
  

Если они действительно упрямы, это завершится неудачей, когда достигнет максимальной глубины рекурсии (~ 900 неправильных ответов)

Комментарии:

1. зачем вам использовать рекурсию для этого? на самом деле не имеет смысла использовать рекурсию здесь… но да, это будет работать так 1