#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